问题标签 [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.
c++ - std::multiset 插入操作的链接器错误
我已将我的一个旧项目(在 VS-2010 中构建)中的头文件和 cpp 文件复制到新项目中(在 QT5.1 中开发它)并遇到了这个奇怪的错误
我不知道如何解决它。
在我的头文件 Message_list.h
消息列表.cpp
在 vs-2010 中成功编译的相同文件..
c++ - 如何检测集合中的当前元素是否是最后一个元素?
我有一个 foreach 循环,std::set
它看起来像
我std::vector
可以检查&line == &lines.back();
有没有办法我可以为 a 做类似的事情std::set
?
c++ - 为什么 std::set 和 set::map 的默认构造函数需要堆分配?
当我尝试这个时:
我明白了Allocating 1 objects
。
但我不明白——为什么这个堆分配是必要的?堆栈内存足以默认构建其他容器(如) ,std::vector
那么为什么需要堆分配呢?set
map
c++ - C++ 特性,如 std::set,允许重复
我有一个std::set
,它存储std::pair
两个整数的 s 。通过std::set
允许我通过帮助课程,也对其进行了排序。但是,到目前为止,我已经编写了很多行代码,现在,在最后一次测试中,“他们”告诉了我一些事情,这实际上意味着我需要在std::set
. 当然,这不是用std::set
. 任何不会让我改变整个大项目的替代方案?
简而言之,我将用作带有两个整数std::set
的数据的有序列表。std::pair
c++ - 将 std::set 或 std::map 与共享内存一起使用
我正在一个有两个不同流程的项目中工作。
- 第一个进程是基于 std::map 或 std::set 的缓存,它在共享内存区域中分配所有数据。
- 第二个进程是一个生产者/消费者,它可以访问共享内存,所以当它需要一些数据时,它会通过一个unix管道向缓存进程询问包含所请求数据的共享内存的起始地址。
到目前为止,我想出了两种方法,首先是将 std::set 的分配函数更改为始终在共享内存中分配,或者以更简单的方法将指向该共享区域的指针存储为映射的值:
任何的想法?:D
谢谢!!
c++ - std::set 擦除复杂性异常?
我试图弄清楚从 std::set 中擦除多个元素的复杂性。我使用这个页面作为来源。
它声称使用迭代器擦除单个项目的复杂性摊销为 O(1),但使用范围形式擦除多个项目是 log(c.size()) + std::distance(first, last) (即 -集合大小的日志 + 删除元素的数量)。
从表面上看,如果要擦除的元素数 (n) 远小于集合中的元素数 (m),这意味着循环遍历要擦除的元素并一次擦除它们会更快(O(n))而不是通过一次调用(O(log m)假设n <<m)擦除它们。
显然,如果真的是这样的话,第二种形式的内部实现只会执行上述循环。
这是网站的错误吗?规格中的错误?我只是错过了什么吗?
谢谢,沙查尔
c++ - C++ 为所有 std::sets 编写通用函数
我需要编写一个小函数,使新的 std::set 从现有元素中获取最后 n 个元素。
这是代码:
它可以工作,但是因为我不需要访问类型 T、S 和 Z,我想知道是否有一种方法可以简单地说“任何 std::set”而无需三个模板参数。
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 坏了吗?
谢谢。
c++ - 来自 std::set insert() 和 find() 的写入数据竞争?
为了试验线程清理器,我创建了一个小型 C++ 程序,该程序有意包含数据竞争。确实,tsan 确实检测到了错误,太棒了!但是我对生成的消息感到困惑......
- 它报告了一个写-写数据竞争,我本来预计会出现一个读写竞争。我希望
find()
不要写在我的容器中。如果我进一步进行小的代码调整以尝试获取 的const
版本set::find()
,似乎仍然存在相同的写入竞争。 - 它显示了 4 字节原子写入和同一地址的 8 字节写入之间的写入冲突。容器类中的同一个字段被两种不同的访问类型访问,这似乎很奇怪。
是否可以选择使用find()
不写入 STL 容器的 const?
这是经过测试的 C++ 程序:
这是 tsan 输出的(部分):
感谢您的任何反馈,乔斯