草庐IT

stl_algobase

全部标签

c++ - 对 STL 容器的安全并行只读访问

我想从并行运行线程访问基于STL的容器只读。不使用任何用户实现的锁定。以下代码的基础是C++11,并正确实现了该标准。http://gcc.gnu.org/onlinedocs/libstdc++/manual/using_concurrency.htmlhttp://www.sgi.com/tech/stl/thread_safety.htmlhttp://www.hpl.hp.com/personal/Hans_Boehm/c++mm/threadsintro.htmlhttp://www.open-std.org/jtc1/sc22/wg21/(currentdraft或N333

c++ - 是否可以强制 STL 集重新评估谓词?

考虑以下数据结构和代码。structSentence{std::stringwords;intfrequency;Sentence(std::stringwords,intfrequency):words(words),frequency(frequency){}};structSentencePCompare{booloperator()(constSentence*lhs,constSentence*rhs)const{if(lhs->frequency!=rhs->frequency){returnlhs->frequency>rhs->frequency;}returnlhs-

C++ STL 分配器与运算符 new

根据C++Primer4thedition,page755,有一条注释说:ModernC++programsordinarilyoughttousetheallocatorclasstoallocatememory.Itissaferandmoreflexible.我不太明白这个说法。到目前为止,我阅读的所有Material都使用new在C++中分配内存。书中展示了vector类如何利用分配器的示例。但是,我想不出其他场景。谁能帮助澄清这个声明?并给我更多的例子?我应该何时使用分配器以及何时使用new?谢谢! 最佳答案 对于一般编程,

c++ - STL vector 并发读取线程安全吗?

我正在开发一个应用程序,其中预计大量线程会迭代一组字符串值并尝试将其自己的数据与列表中可用的数据相匹配。我正在寻找以下用例:Vector用std::string类型的少量元素初始化。(可以说对象名称是strList)。strList将在应用程序启动时进行初始化。所有线程都会遍历strList以查看它的值是否与strList的至少一个元素匹配。没有线程会尝试修改strList,它将被严格用作只读对象。那么你能告诉我并发读取在vector对象上是否是线程安全的吗?我使用的是RHEL6,gcc版本是4.5.x 最佳答案 是的,对于您提到的

c++ - 为什么 STL 仿函数本身是模板化的,而不是它们的函数调用运算符?

STL仿函数是这样实现的:templatestructless{booloperator()(Tconst&lhs,Tconst&rhs){returnlhs这让我们每次创建这样的仿函数时都会提到(可能是长的)类型。为什么它们没有像下面所示那样实现?有什么原因吗?structless{templatebooloperator()(Tconst&lhs,Tconst&rhs){returnlhs这将使它们无需提及(可能很长)类型即可使用。 最佳答案 这也使得将它们专门用于用户定义的类型是不可能的。它们应该是一个自定义点。总结评论中的讨

c++ - 如何在不调用复制构造函数的情况下使用类初始化 STL vector/列表

我有一个C++程序,它使用包含类实例的std::list。如果我调用例如myList.push_back(MyClass(variable));它会先创建一个临时变量,然后立即将其复制到vector中,然后删除该临时变量。这几乎没有我想要的效率,而且当你需要一个深拷贝时很糟糕。我希望我的类new的构造函数有一些东西,而不必为了第二次分配我的内存并浪费运行时而实现一个复制构造函数。我也不想立即从vector/列表中找到类实例,然后手动分配内存(或者做一些可怕的事情,比如在复制构造函数本身中分配内存)。有没有办法解决这个问题(我没有使用VisualStudioBTW)?

c++ - C++ STL中的set和hashset有什么区别?

我什么时候应该选择一个而不是另一个?对于使用正确的STL容器,您有什么建议可以推荐吗? 最佳答案 hash_set是不属于C++标准的扩展。set的查找应该是O(1)而不是O(logn),因此在大多数情况下会更快。当您遍历容器时会看到另一个区别。set将按排序顺序传递内容,而hash_set基本上是随机的(感谢LouFranco)。编辑:对C++标准的C++11更新引入了unordered_set这应该是首选而不是hash_set。性能将相似,并由标准保证。名称中的“无序”强调迭代它会产生没有特定顺序的结果。

C++ STL 列表与集合

对于随机插入和删除,这两者中哪一个更快?我的猜测是列表。虽然在集合的情况下将值作为键也很有吸引力。迭代整个容器的性能是否相似? 最佳答案 列表搜索(线性时间)。插入、删除、移动(需要固定时间)。元素可以排序。元素可以排序。元素可能重复。设置正在搜索(大小为对数)。插入和删除(一般为对数)。元素是无序的。元素总是从低到高排序。元素是独一无二的。 关于C++STL列表与集合,我们在StackOverflow上找到一个类似的问题: https://stackover

java - Java 是否具有类似于 C++ STL 中的多集数据结构?

我需要一个像STL多重集一样工作的数据结构,但Java中的TreeSet不允许重复元素。Java中是否有任何内置的数据结构相当于multiset? 最佳答案 使用Map其中Integer是计数是Multiset的一个很好的替代品,它也不需要任何第三方库。更新:如果您真的想存储对象两次,请使用带有Map的List,例如Map>. 关于java-Java是否具有类似于C++STL中的多集数据结构?,我们在StackOverflow上找到一个类似的问题: https

c++ - 如何检查 STL 迭代器是否指向任何东西?

这个问题在这里已经有了答案:关闭9年前。PossibleDuplicate:C++Bestwaytocheckifaniteratorisvalid我想做这样的事情:std::vector::iteratorit;///cut/searchforsomethinginvectorandpointiteratoratit.if(!it)//checkwhetherfounddo_something();但是没有运算符!对于迭代器。如何检查迭代器是否指向任何东西? 最佳答案 你不能。通常的习惯用法是使用容器的结束迭代器作为“未找到”标记