如何在c ++中迭代数组中的唯一元素[关闭]
Posted
技术标签:
【中文标题】如何在c ++中迭代数组中的唯一元素[关闭]【英文标题】:How to iterate over unique elements in an array in c++ [closed] 【发布时间】:2018-10-21 10:05:37 【问题描述】:假设我有以下数组:
int arr[7] = 18,16,5,5,18,16,4
我怎样才能在一个循环中按照它们出现的顺序迭代唯一元素(18、16、5 和 4)?
我可以使用set,但是迭代的顺序会改变(set 按升序存储元素)。
解决这个问题最快的方法是什么?
【问题讨论】:
如果值在已知的有限范围内,您可以使用查找表。创建一个带有 bool 元素的数组,大小为最大值。使用第一个数组的值作为 bool 数组的索引。std::bitset
也浮现在脑海中。比bool
数组稍慢,但更节省空间。
@zett42 我认为 bool 数组会更好,因为它也更容易实现
【参考方案1】:
遍历数组并将您已经看到的数字存储在一个集合中。对于每次迭代,您检查数字是否已经在集合中。如果是,跳过当前元素。如果不是,则对其进行处理并将其插入到集合中。
另请注意,您需要的是std::unordered_set
,而不是订购的std::set
。顺序对您的过滤集无关紧要。
【讨论】:
有更快的解决方案吗? @Agile_Eagle 可以使用std::vector
代替std::set
,这可能会带来一些性能提升,但是向std::vector
添加唯一的有序元素比仅使用更复杂std::set
.
@Galik 如何将唯一的有序元素添加到向量中?
@Agile_Eagle 这个(没有经过充分测试的)代码就是为了做到这一点。 gitlab.com/Galik/header-only/blob/master/hol/vector_utils.h 但我建议对每种方法进行计时。还可以考虑使用std::unordered_set
。看看哪个在您的情况下提供更好的性能。【参考方案2】:
如果值在已知的有限范围内,您可以使用查找表。创建一个包含 bool
元素的数组,大小为最大值 + 1。使用第一个数组的值作为 bool 数组的索引。
#include <iostream>
int main()
int arr[7] = 18,16,5,5,18,16,4;
constexpr int maxValue = 18;
bool lookup[maxValue + 1];
for( auto i : arr )
if( ! lookup[ i ] )
std::cout << i << ' ';
lookup[ i ] = true;
Live Demo
std::bitset
会更节省空间但也更慢,因为 CPU 不能直接寻址各个位。
只需像这样替换 bool 数组:
std::bitset<maxValue + 1> lookup;
其余代码保持不变。
Live Demo
【讨论】:
以上是关于如何在c ++中迭代数组中的唯一元素[关闭]的主要内容,如果未能解决你的问题,请参考以下文章
如何在 C 或 C++ 中以 O(n) 删除数组中的重复元素?