c++ - 如何在遍历的同时添加要设置的元素?

标签 c++ set

我们有一组 S {1,10,100,1000,10000}。现在我们输入一个整数 x(比如说 x = 4)。

现在我们必须将带有 x 的集合乘积的每个元素添加到集合本身。所以最后

S={1,10,100,1000,10000,4,40,400,4000,40000}

[S最初不限于只有5个条目]

我们只需访问集合中的初始元素。 我尝试了一种方法:

for(auto i=s.begin();i!=s.end();i++)
{
    s.insert((*i)*x);
}

这并没有给出预期的结果,因为集合的大小不断增加。

我尝试的另一种方法是将所有倍数 (*i​​)*x 存储在另一个临时集合/vector 中,稍后将其与 s 合并。 但是由于原始数据集很大,这加剧了时间复杂度。 有什么优化吗?

最佳答案

由于 std::set 是有序的,并且迭代器不会因插入而失效,您可以在迭代时简单地插入,只要您不插入到仍未插入的范围即可迭代。

如果我们可以假设所有数字都是正数,那么我们可以反向迭代,因为乘法的结果总是大于输入:

for (auto it = S.rbegin(); it != S.rend(); ++it)
    S.insert(*it*x);

如果 x 为负数且集合仅包含正数,则迭代顺序无关紧要。如果该集合可能包含负数,这将变得更具挑战性。


But since the original dataset is huge, it worsens the time complexity.

将 N 个元素插入 std::set 是 O(N log N)。合并 std::set 是 O(N log N)。合并方法不会恶化渐近时间复杂度。

不过,如果您要使用 std::unordered_set,合并方法在平均情况下为 O(N)。然而,在最坏的情况下它仍然是 O(N log N)。我建议对无序集使用合并方法。

关于c++ - 如何在遍历的同时添加要设置的元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56934535/

相关文章:

java - 一般来说,我应该在插入元素之前检查它是否在集合中吗?

python - 为什么有时会保持既定秩序?

c++ - OpenCV 相当于 MATLAB 中的阈值

c++ - 使用 yaml-cpp 新 API 解析 yaml 文件 - 问题已修复

c++ - 如何将兼容的唯一指针插入 vector ?

c++ - Directx 位图无法加载

c++ - 找到两组并集的大小?

delphi - 如何正确设置变体发布的属性

c++ - RDTSCP 和指令顺序