如何在C ++中迭代数组中的唯一元素

时间:2018-10-21 10:05:37

标签: c++ arrays loops

假设我有以下数组:

int arr[7] = {18,16,5,5,18,16,4}

如何在循环中按唯一元素(18、16、5和4)的出现顺序对其进行迭代?

我可以使用Docs,但是随后迭代的顺序会改变(集合以升序存储元素)。

最快的解决方案是什么?

2 个答案:

答案 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;
        }
    }
}

Live Demo

std::bitset的空间效率更高,但速度也更慢,因为单个位不能由CPU直接寻址。

像这样简单地替换布尔数组:

std::bitset<maxValue + 1> lookup;

其余代码保持不变。

Live Demo