我有一个我必须忽略的数组,删除所有repetitive
的数字,
例如1 2 4 3 3 0 1 2 0
我所做的是检查了数字并尝试了\0
和NULL
之类的内容,但是它们都给出了值0,因此它不是解决方案。那么有没有办法让索引为空或只是忽略它?数字必须是随机的,所以我不能声明像
array[i]=123;
if(array[i]==123) dont_print_out();
答案 0 :(得分:5)
如果您的数组是纯C ++数组,则无法“删除”项目。 您唯一的解决方案是将剩余的项目移到左侧。
如果您的数组是std::vector
,则可以使用erase
功能。但是,由于向量中基础数据的结构,基本上与以前相同:效率很低。
如果您想要有效删除序列中随机定位的项目,请考虑使用其他类型的容器,例如std::list
。
最后,要实现目标,请查看std::set
或std::unordered_set
。这些容器可确保您的商品独一无二。
答案 1 :(得分:2)
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
。
子>