我有一个数组,我必须忽略,删除所有数字repetitive
,
例如1 2 4 3 3 0 1 2 0
我所做的是我检查了数字并尝试了类似的东西\0
,NULL
但它们都给出了 0 的值,所以这不是一个解决方案。那么有没有办法让索引为空或只是忽略它?数字必须是随机的,所以我不能声明类似
array[i]=123;
if(array[i]==123) dont_print_out();
如果您的数组是一个普通的 C++ 数组,则您没有“删除”项目的方法。您唯一的解决方案是将剩余的项目向左移动。
如果您的数组是 a std::vector
,则可以使用该erase
函数。但是,由于向量中基础数据的结构,您的操作与以前基本相同:效率低下。
如果您想有效地移除随机位于序列中的项目,请考虑使用另一种容器,例如std::list
.
最后,要实现您的目标,请查看std::set
or std::unordered_set
。这些容器确保您的物品是独一无二的。
std::vector
而不是数组,因此您可以擦除项目1。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