假设我有以下数组:
int arr[7] = {18,16,5,5,18,16,4}
如何在循环中按唯一元素(18、16、5和4)的出现顺序对其进行迭代?
我可以使用Docs,但是随后迭代的顺序会改变(集合以升序存储元素)。
最快的解决方案是什么?
答案 0 :(得分:3)
遍历数组,并将您已经看到的数字存储在集合中。对于每次迭代,您都检查数字是否已在集合中。如果是,请跳过当前元素。如果没有,请对其进行处理并将其插入到集合中。
还要注意,您需要的是std::unordered_set
而不是有序的std::set
。顺序与您的过滤条件无关。
答案 1 :(得分:1)
如果值在已知的有限范围内,则可以使用查找表。使用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;
}
}
}
std::bitset
的空间效率更高,但速度也更慢,因为单个位不能由CPU直接寻址。
像这样简单地替换布尔数组:
std::bitset<maxValue + 1> lookup;
其余代码保持不变。