问题标签 [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 回答
2466 浏览

c++ - 为什么使用 std::less 作为默认函子来比较 std::map 和 std::set 中的键?

我想知道为什么std::mapstd::set用作std::less默认函子来比较键。为什么不使用类似于 strcmp 的仿函数呢?就像是:

假设 amap有两个对象,带有键key1key2。现在我们要插入另一个带有 key 的对象key3

使用std::less时,insert函数需要先std::less::operator()key1and调用key3。假设std::less::operator()(key1, key3)返回假。它必须std::less::operator()在切换键的情况下再次调用std::less::operator()(key3, key1),来决定key1是等于key3还是key3大于key1。如果第一个调用返回 false,则有两个调用来std::less::operator()做出决定。

如果std::map::insert使用compare,则只需一次调用即可获得足够的信息来做出正确的决定。

根据地图中键的类型,std::less::operator()(key1, key2)可能会很昂贵。

除非我遗漏了一些非常基本的东西,否则不应该使用类似的东西std::map而不是作为默认函子来比较键吗?std::setcomparestd::less

0 投票
1 回答
250 浏览

c++ - std::map 和 std::set 不返回带有提示的 bool

我怎样才能有效地实现这个显然不存在的功能(为什么?):

我想有效地插入一个值(带有提示),同时有一个布尔值告诉我它是否已被插入(这是必不可少的)。

为什么不存在这样的功能。我无法想出有效地做到这一点的可能性吗?

非常感谢!

0 投票
1 回答
86 浏览

c++ - Cplusplus std::set 二维数组

我是 C++ 新手,我需要Set从 the中使用,STL但我正在为这个概念而苦苦挣扎。

我有一个这样的数组int my_data[3]

我想创建(不知道这是否可能)一个set具有 3 个整数的空间,并且keyfor thesetint是存储在第一列的那个。

我也想做一个自定义排序。

这是我尝试过但没有成功的方法。

有人可以指出我正确的方向吗?

0 投票
1 回答
829 浏览

c++ - 获取存储在 C++ 集中的结构中的值

我声明了一个名为 Position 的结构,它有 2 个数据成员:x、y。我想将这些结构的实例存储到 std::set 中。我以后如何从正确的 Position 结构中检索 x, y 的值?

我正在尝试实现的是 2D 地图中实体的跟踪系统。每次实体移动时,它的当前位置都会被记录到集合中,以便稍后我可以知道它到了哪里。

我通过每次移动时调用它来记录它的当前位置。

稍后,我想查看我的实体将要访问的新单元格是否已被访问。如果是,那么我会告诉实体选择其他单元格做某事,方法是说类似

问题是我不知道如何找到具有要比较的正确数据的正确单元格。对不起,如果这听起来真的很混乱

0 投票
1 回答
1751 浏览

c++ - 插入指向 std::set 的指针

在带有和不带有指针的 Set 上插入值的行为不同。这段代码有什么问题?第一个 for 循环是使用指针插入集合,第二个是不使用指针。但除此之外,其他一切都完全相同。

输出:

0 投票
2 回答
142 浏览

c++ - C++ 集合迭代器未到达集合末尾

我最近决定为最近结束的 topcoder.com 比赛尝试 C++ 解决方案,作为学习语言的一种方式(对 C++ 不熟悉)。但是,当通过 std::set 对象的迭代没有成功到达集合中的所有元素(set.count > # 个遍历的元素)时,我感到很困惑。我徒劳地寻找在 StackExchange 和其他地方经历过这种情况的其他人。

细节

我已将代码发布到 pastebin:http://pastebin.com/U7xQzDQg

我正在尝试做的是一种天真的聚类算法。我确信有更好的方法来实现我想做的事情;但这在这个阶段我并不感兴趣(因为我的重点是学习语言及其特性)。我用 Position 对象表示笛卡尔网格中的正方形,具有属性“x”和“y”。使用迭代方法,我扫描整个网格以寻找相同颜色的对象,并将它们分组为 Cluster 对象。当算法完成时,将有一组 Clusters,每个 Clusters 都包含一组 Position 对象,它们之间的距离不超过设定的距离。在算法过程中的某个时刻,有必要合并彼此靠近的簇;这就是我开始遇到问题的地方。

如果您编译并运行粘贴在 pastebin 上的代码,您将看到如下消息:

如果我的代码工作正常,最后一行应该显示的是:

每当尝试合并时都会生成这些行(参见第 54 行);使用标准集迭代由运算符转换方法(参见第 97 行)生成的 Cluster 对象的字符串表示形式。

很清楚的是,尽管该集合声称拥有正确数量的元素,但遍历该集合并没有到达所有元素。我认为这可能是对象超出范围并被破坏的问题;但情况似乎并非如此,因为 std::set 对象在将元素插入数据结构之前复制元素(并且在其他情况下建议使用 Position 元素上的析构函数进行测试)。

我真的很茫然,不想绕开它......因为我认为我在这里遗漏了一些重要的东西。谁能帮我?

最好的,马修

0 投票
4 回答
327 浏览

c++ - 将 std::sets 合并到 std::vector

考虑以下。

我有两个std::sets 并希望std::vector按排序顺序合并它们。

哪种方法最有效?

我做了这样的事情,但我认为必须有更好的方法来做到这一点。

这是我的代码,有没有更有效的方法?提前致谢。

0 投票
1 回答
54 浏览

performance - 来自 std::set 的复合容器比 std::set 本身快吗?

我制作了一些复合容器Range,它接受最小/最大范围作为 astd::pair或一组整数作为std::set.

在内部,它将输入的副本保存为void *

这个容器支持iterators,我很好奇这个容器与迭代 set 相比有多快std::set

我确保使用以下策略编写测试中的每个迭代循环:

  • 无后增量(较慢)
  • 确保编译器无法完全优化循环
  • 比较相同的东西

我有以下时间: 性能测试

速度测试
范围的运行时间:[对]:13.0522 毫秒
范围的运行时间:[设置]:272.54 毫秒
std::set 的运行时间:438.239 毫秒
范围的运行时间:正常 For Loop:0.000175 毫秒

首先 我很惊讶,我也希望你,因为为什么我的Range容器应该更快,因为Range包含 bot 的迭代器std::pair(只是一个整数)和 for的迭代器std::set。如果是 a ,我的实现Range::iterator实际上将所有运算符转发到 std::set 。Rangestd::set

其次 ,您对执行此操作有任何意见要高效。可能有更好的方法吗?

0 投票
1 回答
184 浏览

c++ - 具有个人比较功能的 std::set 具有相同的值

我要存储一个std::set对象Point3D,我的比较函数定义如下(字典序):

在某些情况下set包含相同的点,我认为问题来自比较功能,但我没有找到确切的问题。任何帮助,将不胜感激!

0 投票
1 回答
407 浏览

c++ - 如何使用 C++ std::sets 作为类的构建块?

我需要一个满足以下条件的数据结构:

  • 存储任意数量的元素,其中每个元素由 10 个数字指标描述
  • 允许log n通过任何指标快速 ( ) 搜索元素
  • 允许快速 ( log n) 插入新元素
  • 允许快速 ( log n) 移除元素

让我们假设这些元素的构建成本很高。

我想出了以下计划

  • 将所有元素存储在一个名为 DATA 的向量中。
  • 使用 10 std::sets,10 个指标中的每一个。每个std:set都是轻量级的,它只包含整数,它们是向量的索引DATA。比较运算符在 DATA 中“查找”适当的元素,然后选择适当的度量

元素永远不会从向量中修改或删除。一个新元素被推回 DATA,然后它的索引 ( DATA.size()-1) 被插入到集合 ( set<int, Cmp<..> >) 中。为了删除一个元素,我在元素中设置了一个标志,表示它已被删除(实际上并未将其从DATA向量中删除),然后从所有十个 std::set 中删除元素索引。

只要DATA是全局变量,它就可以正常工作。(它还通过使模板化的结构 Cmp 依赖于全局变量而在某种程度上滥用了类型系统。)

但是,我无法将DATA向量和 std::set 的 ( set<int, Cmp<...> >) 包含在一个类中,然后将DATA它们“索引” std::sets。对于初学者,在外部类中定义的比较运算符 Cmp 无法访问外部类的字段(因此它无法评估 DATA)。我也无法将向量传递给 Cmp 构造函数,因为 Cmp 是由 std::set 构造的,而 std::set 需要一个带有没有参数的构造函数的比较运算符。

我有一种感觉,我正在反对 C++ 类型系统,并试图实现类型系统故意阻止我做的事情。(我试图使 std::set 依赖于仅在运行时构造的变量。)虽然我理解类型系统可能不喜欢我所做的事情,但我认为这是一个合法的用例。

有没有办法实现我上面描述的数据结构/类而不提供 std::set/red-black 树的重新实现?我希望可能有一个我还没有想到的技巧。(是的,我知道 boost 有一些东西,但我想坚持使用标准库。)