问题标签 [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 投票
0 回答
100 浏览

c++ - std::multiset 插入操作的链接器错误

我已将我的一个旧项目(在 VS-2010 中构建)中的头文件和 cpp 文件复制到新项目中(在 QT5.1 中开发它)并遇到了这个奇怪的错误

我不知道如何解决它。

在我的头文件 Message_list.h

消息列表.cpp

在 vs-2010 中成功编译的相同文件..

0 投票
3 回答
61 浏览

c++ - 如何检测集合中的当前元素是否是最后一个元素?

我有一个 foreach 循环,std::set它看起来像

std::vector可以检查&line == &lines.back();

有没有办法我可以为 a 做类似的事情std::set

0 投票
2 回答
1060 浏览

c++ - 为什么 std::set 和 set::map 的默认构造函数需要堆分配?

当我尝试这个时:

我明白了Allocating 1 objects

但我不明白——为什么这个堆分配是必要的?堆栈内存足以默认构建其他容器(如) ,std::vector那么为什么需要堆分配呢?setmap

0 投票
2 回答
9020 浏览

c++ - C++ 特性,如 std::set,允许重复

我有一个std::set,它存储std::pair两个整数的 s 。通过std::set允许我通过帮助课程,也对其进行了排序。但是,到目前为止,我已经编写了很多行代码,现在,在最后一次测试中,“他们”告诉了我一些事情,这实际上意味着我需要在std::set. 当然,这不是用std::set. 任何不会让我改变整个大项目的替代方案?

简而言之,我将用作带有两个整数std::set的数据的有序列表。std::pair

0 投票
1 回答
1344 浏览

c++ - 将 std::set 或 std::map 与共享内存一起使用

我正在一个有两个不同流程的项目中工作。

  • 第一个进程是基于 std::map 或 std::set 的缓存,它在共享内存区域中分配所有数据。
  • 第二个进程是一个生产者/消费者,它可以访问共享内存,所以当它需要一些数据时,它会通过一个unix管道向缓存进程询问包含所请求数据的共享内存的起始地址。

到目前为止,我想出了两种方法,首先是将 std::set 的分配函数更改为始终在共享内存中分配,或者以更简单的方法将指向该共享区域的指针存储为映射的值:

任何的想法?:D

谢谢!!

0 投票
2 回答
8892 浏览

c++ - std::set 擦除复杂性异常?

我试图弄清楚从 std::set 中擦除多个元素的复杂性。我使用这个页面作为来源。

它声称使用迭代器擦除单个项目的复杂性摊销为 O(1),但使用范围形式擦除多个项目是 log(c.size()) + std::distance(first, last) (即 -集合大小的日志 + 删除元素的数量)。

从表面上看,如果要擦除的元素数 (n) 远小于集合中的元素数 (m),这意味着循环遍历要擦除的元素并一次擦除它们会更快(O(n))而不是通过一次调用(O(log m)假设n <<m)擦除它们。

显然,如果真的是这样的话,第二种形式的内部实现只会执行上述循环。

这是网站的错误吗?规格中的错误?我只是错过了什么吗?

谢谢,沙查尔

0 投票
1 回答
122 浏览

c++ - C++ 为所有 std::sets 编写通用函数

我需要编写一个小函数,使新的 std::set 从现有元素中获取最后 n 个元素。

这是代码:

它可以工作,但是因为我不需要访问类型 T、S 和 Z,我想知道是否有一种方法可以简单地说“任何 std::set”而无需三个模板参数。

0 投票
1 回答
2365 浏览

c++ - 由于编译错误,C++ std::set 无法在迭代器上使用运算符 +

所以我只在 std::set 上遇到了一个奇怪的迭代器错误:我无法在没有编译错误的情况下在迭代器上做一个简单的事情,比如 (it + 1) 尝试自己编译:

错误:二进制表达式的无效操作数 ('std::_ 1:: _tree_const_iterator *, long>' 和 'int') if ((it + 1) != values.end())

错误:二进制表达式的无效操作数 ('std::_ 1:: _tree_const_iterator *, long>' 和 'int') values.insert(*it / *(it + 1));

编译器版本:Apple LLVM 5.0 版(clang-500.2.79)(基于 LLVM 3.3svn)目标:x86_64-apple-darwin13.1.0 线程模型:posix

我找到了一个肮脏的解决方案: (auto it2 = ++it ; --it) 可行,但这真的很脏......

有人解释一下吗?std::set 坏了吗?

谢谢。

0 投票
1 回答
73 浏览

c++ - 根据条件将元素从 std::vector 复制到 std::set 但它崩溃

0 投票
1 回答
282 浏览

c++ - 来自 std::set insert() 和 find() 的写入数据竞争?

为了试验线程清理器,我创建了一个小型 C++ 程序,该程序有意包含数据竞争。确实,tsan 确实检测到了错误,太棒了!但是我对生成的消息感到困惑......

  1. 它报告了一个写-写数据竞争,我本来预计会出现一个读写竞争。我希望find()不要写在我的容器中。如果我进一步进行小的代码调整以尝试获取 的const版本set::find(),似乎仍然存在相同的写入竞争。
  2. 它显示了 4 字节原子写入和同一地址的 8 字节写入之间的写入冲突。容器类中的同一个字段被两种不同的访问类型访问,这似乎很奇怪。

是否可以选择使用find()不写入 STL 容器的 const?

这是经过测试的 C++ 程序:

这是 tsan 输出的(部分):

感谢您的任何反馈,乔斯