【问题标题】:c++ declare an array index as emptyc ++将数组索引声明为空
【发布时间】:2013-06-12 14:41:28
【问题描述】:

我有一个必须忽略的数组,删除所有repetitive 的数字,

例如1 2 4 3 3 0 1 2 0

我所做的是检查了数字并尝试了 \0NULL 之类的东西,但它们都给出了 0 的值,所以这不是解决方案。那么有没有办法让索引为空或只是忽略它?数字必须是随机的,所以我不能声明类似

array[i]=123;
if(array[i]==123) dont_print_out();

【问题讨论】:

    标签: c++ arrays repeat


    【解决方案1】:

    如果您的数组是一个普通的 C++ 数组,则您没有“删除”项的方法。 您唯一的解决方案是将剩余的项目向左移动。

    如果您的数组是std::vector,您可以使用erase 函数。但是,由于向量中基础数据的结构,您的操作与之前基本相同:效率低下。

    如果您想有效地移除随机位于序列中的项目,请考虑使用另一种容器,例如 std::list

    最后,要实现您的目标,请查看std::setstd::unordered_set。这些容器确保您的物品是独一无二的。

    【讨论】:

    • 1.使用std::list 来支持随机删除几乎总是一个错误。您在遍历列表以查找重复项时损失的比在快速删除本身中获得的损失更多。 2. 带有std::unique 的向量通常会比std::set 甚至std::unordered_set 更快。 3.只要不关心保持原始顺序,就可以高效地从向量中擦除。
    • @Jerry Coffin: 3. 好的,如果您将最终项目移动到移除创建的hole,对吗?
    • 您通常希望将要删除的项目交换到最后。使用int 复制会很好,但是使用std::stringstd::vector 之类的东西,交换通常会更快(如果有的话,它会很慢,如果有的话,这将是非常不寻常的)。
    【解决方案2】:
    1. 使用std::vector 代替数组,这样您就可以擦除项目1
    2. 如果您不需要保持原始顺序,排序可能最简单,然后使用std::unique 消除重复项。

    代码可能如下所示:

    std::vector<int> numbers;
    
    srand(time(NULL));
    
    std::generate_n(std::back_inserter(numbers), 10, rand);
    std::sort(numbers.begin(), numbers.end());
    std::copy(numbers.begin(), std::unique(numbers.begin(), numbers.end()), 
              std::ostream_iterator<int>(std::cout, "\t"));
    
     // Or, as @Chris pointed out:
     std::unique_copy(numbers.begin(), numbers.end(),
              std::ostream_iterator<int>(std::cout, "\t"));
    

    请注意,由于std::unique 返回一个迭代器到唯一数字范围的末尾,我们实际上根本不需要擦除其他数字——我们可以将它用作我们显示的范围的末尾。

    另外请注意,由于我在这里生成了数字,实际上删除任何东西是很不寻常的——考虑到rand() 的典型实现产生的数字范围,看到它产生是相当不寻常的仅 10 次迭代中的任何重复项。

    如果您确实需要维持原始订单,您有几个选择。一种是在打印出来时将每个项目插入到std::set(或std::unordered_set)中,并且只有在插入成功后才将其打印出来(即以前不存在)。


    1. 虽然这只是 许多 选择 std::vector 而不是数组的原因之一。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-25
    • 2019-08-15
    • 1970-01-01
    • 2013-07-22
    • 1970-01-01
    • 2019-02-12
    • 1970-01-01
    • 2017-06-02
    相关资源
    最近更新 更多