如何在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) 删除数组中的重复元素?

如何在不迭代的情况下访问数组中的特定元素?

如何在数组元素中搜索哈希键中的匹配项

如何在reactjs或js中的includes关键字中传递元素数组作为参数[关闭]

如何在Swift中删除数组中的每个其他元素?

在VBA中如何遍历数组中的每个元素?