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

c++ - 通过不影响不变量的集合的 NON-const 迭代器访问成员

假设我有这样的代码:

我如何向编译器保证编写 MoreFields 不会影响任何不变量或不会做任何事情来使集合中元素的顺序无效?

如果唯一的办法是使用另一个容器,例如向量,我如何在排序位置插入一个新值,同时检查一个是否已经存在?

0 投票
3 回答
303 浏览

c++ - 对于 std::set,相同的“值”意味着什么?

在 C++ 中,std::set::insert() 仅在没有具有相同“值”的值时插入一个值。同样,这是否意味着 operator== 或者它是否意味着 operator< 对于任何一个排序都是错误的,或者它是否意味着其他东西?

0 投票
4 回答
274 浏览

c++ - 如果我的键是我的价值的一部分,我应该使用地图还是集合?

在 C++ 中,我有一个按其名称排序的类,即std::string. 我希望在 astd::mapstd::set.

我可以使用 a std::set,因为operator<它将按名称对我的实例进行排序,但是,我需要按名称查找实例。使用键是名称的映射是直截了当的,但是,我也可以使用一个集合并构造一个具有我希望查找的名称的类的虚拟实例,以在集合中定位给定类的实际实例姓名。

我想我应该只使用地图以使代码直截了当,但想知道是否有办法使用该集合,因为无论如何密钥实际上都是我的对象的一部分,从而避免了一些冗余。

有没有办法使用该集合并能够以干净的方式通过它们的键定位对象,或者我应该只使用地图并完成它?

这是要插入的类(以草稿形式),并且在每个目录中都有一组节点或节点映射,它们以节点名称为键:

0 投票
2 回答
1786 浏览

c++ - 如何将 std::set 放入 std::map

我在下面声明了std:map:

但是我有很多错误,例如:

错误 16 错误 C2676: 二进制 '<': 'const std::string' 未定义此运算符或转换为预定义运算符可接受的类型 c:\program files (x86)\microsoft Visual Studio 10.0\vc\include \x功能

我究竟做错了什么?

0 投票
5 回答
16436 浏览

c++ - C++ std::map 或 std::set - 有效地插入重复项

我有一堆充满重复的数据,我想消除重复。你知道,例如 [1, 1, 3, 5, 5, 5, 7] 变成 [1, 3, 5, 7]。

看起来我可以使用 std::map 或 std::set 来处理这个问题。但是我不确定(a)简单地将所有值插入容器中是否更快,或者(b)检查它们是否已经存在于容器中并且仅在它们不存在时才插入 - 插入是否非常有效?即使有更好的方法......你能建议一种快速的方法吗?

另一个问题 - 如果我存储在其中的数据不像整数那么微不足道,而是一个自定义类,std::map 如何管理正确存储(散列?)数据以便通过运算符快速访问 [ ]?

0 投票
1 回答
101 浏览

vector - C++中的向量唯一性

这是我之前的问题的后续,我想知道在 std::set 中存储非重复任意数据的最有效方法。

答案很有帮助地指出,对于自定义类,您需要实现 operator< (如果我理解正确的话)。

但是,我的特定数据类型是向量(在数学意义上)。我想要做的是仅在集合中不存在新向量时才将其存储。为此,如何在两个向量之间实现小于运算符?当有 3 个正交维度可供比较时,这似乎没有意义。我可以使用什么策略来做到这一点?

0 投票
4 回答
197 浏览

c++ - 在没有迭代器 C++ 的 std::set 中搜索

我有std::set其中包含的int值。现在我使用迭代器来找出是否setcontans value

但是我的应用程序使用这个搜索非常频繁并且使用迭代器搜索太慢了,我可以做这样的事情吗:

但是使用 G++ 编译时出现错误

'fdsockets[fd]' 中的 'operator[]' 不匹配

也许我可以用一些东西代替std::set

谢谢!

0 投票
5 回答
99840 浏览

c++ - 如何找到两个 STL 集的交集?

我一直试图在 C++ 中找到两个 std::set 之间的交集,但我一直收到错误消息。

我为此创建了一个小样本测试

后一个程序不会生成任何输出,但我希望有一个s3具有以下值的新集合(我们称之为它):

相反,我收到了错误:

我从这个错误中理解的是,没有set_intersection接受Rb_tree_const_iterator<int>作为参数的定义。

此外,我想该std::set.begin()方法返回这种类型的对象,

std::set有没有更好的方法在 C++中找到两者的交集?最好是内置函数?

0 投票
1 回答
1379 浏览

c++ - C++ 从这里用 std::set 实例化错误

我发现了一堆关于“从这里实例化”问题的线程。他们似乎都是忘记了默认构造函数的人。我认为我的问题是不同的(但是我是 C++ 新手,它可能对同一个问题略有不同,我只是不知道如何实现解决方案)。

我正在尝试插入一个集合,显然它正在从那里实例化。它正在引发错误。

任何帮助总是受到赞赏。

0 投票
1 回答
935 浏览

stl - 如何在已排序的数组中插入元素以使数组保持排序状态?

在 c++中,std::set按排序顺序存储元素可以在 O(log n) 时间内插入元素。但是我知道的所有方法都需要线性时间:

在数组末尾插入元素并将其与前一个元素交换,直到前一个元素小于它 - 需要线性时间。

在数组上使用二进制搜索并找到要插入元素的位置:需要 O(log n) 时间,但在最坏的情况下将元素插入给定位置需要 O(n) 时间。

如果我们将排序后的数组用作堆,我们可以在 O(log n) 时间内插入一个元素,但即使在此之后数组仍然是堆,也不能保证它仍然是排序的。

我需要一种在 O(log n) 时间内将元素插入排序数组的方法,我知道这是可能的,因为std::set可以做到,但我不知道怎么做。