问题标签 [stdset]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
2519 浏览

c++ - C++ 中 std::set 的自定义比较运算符和自定义类

我想创建一个包含我的类的对象的集合,我必须确定一个自定义比较。不幸的是,我尝试的一切都没有奏效。

Ant 然后是比较结构:

请问我怎样才能使这项工作?

目前,该问题显示该标识符a并且b未声明。

0 投票
1 回答
1692 浏览

c++ - 在 std::set 中排序和与 std::unordered_set 的区别

我希望 的顺序std::setstd::listor一样一致std::vector,只是不会再次附加一个值。MSVC 110 证明我错了。我预计下面的代码会产生下面显示的结果,这是在 ideone ( http://ideone.com/e47GwQ ) 上运行代码时的情况(但不确定他们使用的是哪个编译器和版本)。

在 Visual Studio 2012 中运行代码会产生如下所示的结果。

现在,为什么我瘦了,std::set就像上面描述的那样?因为 cplusplus.com 声明

集合是按照特定顺序存储唯一元素的容器。

此外,还有std::unordered_set.

  1. 我是否错误地理解了文档,std::set而是按价值排序
  2. 那有什么std::unordered_set用呢?
  3. 是否有其他标准库容器可以满足我的要求?
0 投票
2 回答
780 浏览

c++ - 为什么取消引用 std::set 时需要 const::迭代器?

我有以下代码:

当我改变时:

至:

它停止工作。显然(*it)返回 a const vector<int>&,但为什么会这样呢?该集合包含向量,而不是const向量。

0 投票
0 回答
152 浏览

c++ - 有效处理大量独特元素(std::set 与其他容器)

我有 std::set 有大量唯一对象作为其元素。

在程序的主线程中:

  1. 我从片场拿了一些东西
  2. 将要处理的数据分配给它们中的每一个
  3. 从集合中移除这些对象
  4. 最后将对象传递给线程池中的线程进行处理
  5. 一旦这些线程完成处理对象,它们就会将它们添加回集合中。(这样在下一次迭代中,主线程可以再次将下一批数据分配给这些对象进行处理)

这种安排很完美。但是,如果我在将对象添加回集合时遇到错误(例如std::set.insert()throws bad_alloc),那么一切都会继续。如果我忽略该错误并继续,那么对象将无法返回处理集中,并且它永远不会出现在程序流之外,从而导致内存泄漏。

为了解决这个问题,我尽量不要从集合中移除对象。相反,有一个成员标志,指示对象正在“正在处理”。但在这种情况下,问题是,主线程在遍历集合的所有元素时一次又一次地遇到“正在处理”的对象。它严重影响了性能(集合中的对象数量非常大)。

这里有什么更好的选择?

  1. 可以std::list用来代替std::set吗?列表在添加元素时不会有bad_alloc问题,因为它只需要在向列表添加元素时分配指针。但是我们如何才能使列表元素独一无二呢?如果我们实现了它,它会像 std::set 一样有效吗?

  2. 有没有办法元素移动到集合的开头或结尾,而不是删除和添加回元素到 std::set?这样未处理的对象和已处理的对象将一起累积到集合的开始和结束。

  3. 请问还有什么解决办法吗?

0 投票
0 回答
1129 浏览

c++ - 标准集插入和联合有效方式

我正在解决一个我试图联合并尝试使用非常简单的基准测试代码来查看效率的问题。

代码非常简单(插入)几百万个元素到一个集合中。为了简单起见,让 set_union 远离讨论。

测试代码:

方法 1:最慢(如预期):~38 秒 方法 2:最快(如预期):~8 秒 方法 3:~20 秒 方法 4:~20 秒 方法 5:~20 秒

结果有意义,方法 3 和 4 是相同的,在深入研究方法 5 时,我发现 std::inserter 创建了一个输出迭代器,它在分配时与方法 3/4 完全相同(或转换为相同)。

这是故意的吗?为什么不能以最有效的插入方式来编写算法?方法 2 给出了准确的提示,而 3,4,5 将迭代器增加到 set.end() (在这种情况下,当我插入排序范围时,std::next(insert(pos,new_max_element)) == set::end()) 并始终将其作为插入提示。

如果我使用 std::inserter 将迭代器传递给此类有序容器,这会使使用 stl 算法效率低下。附带说明:如果对另一组的插入操作是对数的,我不明白 set_union 如何在线性时间内工作。例如 set_union(set_1.begin(), set_1.end(), set_2.begin(), set_2.end(), std::inserter(output_set, output_set.end()) 。已排序的向量很好,但设置了?可以任何人都放了一些链接或参考复杂性分析?

此外,如果有人可以解释或提供一些复杂性分析的参考,以证明插入具有正确提示的集合(例如下一个数字总是小于或大于当前插入的数字)会给您的算法带来一个平均的常数复杂性,那将是很棒的而不是登录。

0 投票
3 回答
153 浏览

c++ - 集合的重载运算符

我正在使用 std::set 来实现特定的算法。该集合中有重复项,所以我认为我必须重载运算符。重载看起来像这样。

我重载了它,所以我可以使用 std::set 中所需的 < 运算符。如果 v0 < v1 到某个边距,此函数返回 true。它会删除重复项,但也会删除集合中的有效值。我知道我的设备应该有 12 个 Vec3fs。有了重复项,它有 24 个 Vec3fs。使用我的比较功能,它只有 3 个 Vec3f。我考虑使用绝对差异,但这违反了严格的弱排序标准。我的问题是:如何编写比较函数来删除重复项并仅保留唯一项?

0 投票
1 回答
309 浏览

c++ - VectorXd 和 std::set:重复元素

我正在尝试与Eigen 库中的std::set一起使用:VectorXd

函数vecCompare定义如下:

不幸的是,我最终在 yx 中有重复的元素。有任何想法吗?

Edit1:对于简单的例子,一切正常,例如,

在我的代码中,我插入了大约 2000 个向量,得到了大约 200 个重复元素。

Edit2:向量是通过算法计算的。我按照插入向量的顺序输出向量,yx直到插入两个重复元素,得到以下列表:

然后我手动创建了这 30 个向量,并将它们手动插入到一个集合中。令人惊讶的是,一切正常。我不明白这一点。

Edit3:我还注意到,在运行以下命令时,尽管包含大约 200 个重复项,但zz仍保持在。0yx

0 投票
1 回答
815 浏览

c++ - 如何插入集合和双端队列

我有一个 C++ 函数,该函数需要将一系列连续整数插入到一个集合中,并且对于该集合的每个新元素在出列末尾以与迭代相同的顺序插入。下面是一个大约为 O(log(n) * n) 的解决方案,因为重复插入每个都是 O(log(n))。我想得到一个 O(n) 解决方案。我想使用带有提示迭代位置的 set::insert() ,但是如果我这样做,我看不到如何在恒定时间内确定该项目是否已经在集合中。

有没有办法将其重构为 O(n) 并完成相同的工作,同时保持函数的参数不变?有没有办法使用迭代器提示插入并且还知道该项目是否被插入?

0 投票
2 回答
179 浏览

c++ - 用于存储排序的唯一值的 C++ 容器,具有用于排序和唯一性的不同谓词

我有一个包含 2 个字段(例如 A 和 B)的记录。如果它们的 As 相等,则应将记录的 2 个实例视为相等。另一方面,记录实例的集合应按 B 字段排序。

有没有像 std::set 这样的容器,它可以用两个不同的谓词定义,一个用于排序,一个用于唯一性,所以我可以避免显式排序而只附加元素?如果没有,如何解决?

问候,

0 投票
1 回答
3866 浏览

c++ - 如何比较二维空间中的两点

Points我有一个像这样在 2D 空间中保存我的类:

我喜欢将这些Points放在 astd::set但我不知道如何编写比较结构

两点像pq相等,如果(p_1,p_2) = (q_1,q_2)。我必须在Point课堂上存储一些额外的信息吗?每个索引或任何唯一编号之类的东西Point?并有这样的事情: