c ++将数组索引声明为空

时间:2013-06-12 14:41:29

标签: c++ arrays repeat

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

例如1 2 4 3 3 0 1 2 0

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

这样的东西
array[i]=123;
if(array[i]==123) dont_print_out();

2 个答案:

答案 0 :(得分:5)

如果您的数组是纯C ++数组,则无法“删除”项目。 您唯一的解决方案是将剩余的项目移到左侧。

如果您的数组是std::vector,则可以使用erase功能。但是,由于向量中基础数据的结构,基本上与以前相同:效率很低。

如果您想要有效删除序列中随机定位的项目,请考虑使用其他类型的容器,例如std::list

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

答案 1 :(得分:2)

  1. 使用std::vector代替数组,因此您可以删除项目 1
  2. 如果您不需要维护原始订单,则可能最容易排序,然后使用std::unique来消除重复订单。
  3. 代码看起来像这样:

    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