【问题标题】:How to iterate over unique elements in an array in c++ [closed]如何在c ++中迭代数组中的唯一元素[关闭]
【发布时间】: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 数组会更好,因为它也更容易实现

标签: c++ arrays loops


【解决方案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

【讨论】:

    猜你喜欢
    • 2018-06-19
    • 1970-01-01
    • 2022-08-13
    • 2022-11-22
    • 2013-11-21
    • 2021-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多