2

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

例如1 2 4 3 3 0 1 2 0

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

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

2 回答 2

5

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

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

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

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

于 2013-06-12T14:43:30.620 回答
2
  1. 使用 anstd::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

于 2013-06-12T14:52:38.953 回答