草庐IT

stl_algobase

全部标签

c++ - STL映射是如何分配的?堆栈还是堆?

我想知道c++中的STLmap是否具有连续内存-还是分配给堆的内存? 最佳答案 因为map是一个动态容器,它的元素的内存是动态分配的(无论那意味着什么(它取决于一个可配置的分配器)!).此外,map是一个基于节点的容器,因此每个元素都进入一个不同的、单独的分配(以便允许最大迭代器和引用非无效).元素几乎肯定在内存中是连续的,并且可能以反射(reflect)您添加它们的方式的方式分散。实际上,映射将实现为某种类型的平衡树,以实现对数查找、插入和删除时间。(如果您想要具有连续存储和对数查找时间的数据结构,请考虑排序vector。)

c++ - STL 中的写时复制支持

我刚刚在读aWikipediaarticleonCopy-on-write(很好奇有没有文件系统支持),被下面这段话惊到了:COWisalsousedoutsidethekernel,inlibrary,applicationandsystemcode.ThestringclassprovidedbytheC++standardlibrary,forexample,wasspecificallydesignedtoallowcopy-on-writeimplementations:std::stringx("Hello");std::stringy=x;//xandyusethesam

c++ - 如何将元素移出 STL 优先级队列

C++的STL优先级队列有一个voidpop()方法和一个constreftop()方法。因此,如果你想将元素移出队列,你必须这样做:Tmoved=std::move(const_cast(myQueue.top())));myQeue.pop();这有效地将top转换为非常量,以便它可以move(而不是复制)。我不喜欢这段代码,因为强制move可能会使优先级队列的不变量无效,这应该因为弹出而无关紧要,但事情可能出错。有没有更好的方法来完成弹出/move?为什么没有T&&top_and_pop()函数? 最佳答案 std::prio

c++ - STL中的 float 比较,BOOST

STL或Boost中是否有一套通用的简单比较函数?我发现的那个总是需要模板参数,和/或实例化一个结构模板。我正在寻找语法如下的内容:if(is_equal(x,y)){...}可以实现为:templateboolis_equal(constT&x,constT&y){return(fabs(x-y)::eps);}编辑:我将运算符更改为等于。(见下面的评论) 最佳答案 我不知道有哪个库可以做到这一点,也许是因为它像一行代码一样简单,或者也许是因为它被遗忘了......尽管如此,您确定要在整个应用程序中为给定值的给定类型设置epsil

c++ - 在这种情况下,为什么 STL priority_queue 并不比 multiset 快多少?

我正在比较STL(g++)priority_queue的性能,发现push和pop没有我预期的那么快。见以下代码:#include#includeusingnamespacestd;typedefmultisetIntSet;voidtestMap(){srand(0);IntSetiSet;for(size_ti=0;iIntQueue;voidtestPriorityQueue(){srand(0);IntQueueq;for(size_ti=0;i我编译了这个-O3然后运行了valgrind--tool=callgrind,KCachegrindtestMap占用总CPU的54%

c++ - 什么是 iota_n 的良好实现(STL 中缺少算法)

对于C++11,STL现在有一个std::iota函数(参见reference)。但是,与std::fill_n、std::generate_n相比,没有std::iota_n。什么是一个好的实现呢?直接循环(备选方案1)或使用简单的lambda表达式委托(delegate)给std::generate_n(备选方案2)?备选方案1)templateOutputIteratoriota_n(OutputIteratorfirst,Sizen,Tvalue){while(n--)*first++=value++;returnfirst;}备选方案2)templateOutputItera

c++ - 哪个 STL 容器用于具有基于 key 的访问的有序数据?

假设我有一组Person对象,每个对象如下所示:classPerson{stringName;stringUniqueID;}现在,这些对象必须存储在一个允许我订购它们的容器中,这样我就可以给元素X轻松找到元素X+1和X-1。但是,我还需要基于UniqueID的快速访问,因为集合会很大并且线性搜索不会削减它。我目前的“解决方案”是结合使用std::list和std::map。该列表包含人员(用于有序访问),映射用于将UniqueID映射到对列表项的引用。更新“容器”通常涉及更新map和列表。它有效,但我觉得应该有一种更聪明的方法来实现它,也许是boost:bimap。有什么建议吗?编辑

c++ - "CopyConstructible"对 C++ STL 容器元素的要求

关于C++STL容器元素的要求,标准是这样说的:元素类型应该是CopyConstructible,对于CopyConstructible的要求有一个表。此外,根据各种书籍(Josuttis等),生成的拷贝应该“等同于”来源。我想我需要在这里澄清一下。究竟什么是“等同于”?另外,我对“CopyConstructible”和“深/浅拷贝”之间的关系有点困惑。通常,复制构造函数是浅复制或深复制。那么哪个适用于“CopyConstructible”,哪个不适用?感谢任何评论! 最佳答案 深拷贝或浅拷贝都有效。例如,shared_ptr总是进

c++ - STL 有序集,其中顺序条件可能会更改

我有一个C++STL集,其中定义了自定义顺序。我的想法是,当项目被添加到集合中时,它们会自然地按我想要的顺序排列。但是,我刚刚意识到排序谓词会随着时间的推移而改变。据推测,集合中的项目将不再按顺序排列。所以真的有两个问题:元素出现故障是否有害?我说得对吗,可能发生的最坏情况是新条目可能被放入错误的位置(实际上我可以忍受)。或者,这会导致崩溃、丢失条目等吗?有没有办法“刷新”集合的顺序?您似乎无法在集合上使用std::sort()。我能想到的最好办法是将内容转储到临时容器中并重新添加它们。有什么想法吗?谢谢,约翰 最佳答案 set使用

c++ - 关于RAII、STL pop、PIMPL的基本问题

今天阅读proggit时,我在post中看到了这条评论关于C++如何在GoogleAi挑战赛中名列前茅。用户reventlov声明ThebiggestproblemIhavewithC++isthatit'swaaaytooeasytothinkthatyou'rea"C++programmer"withoutreallyunderstandingallthethingsyouneedtounderstandtouseC++acceptablywell.You'vegottoknowRAII,andknowtousenamespaces,andunderstandproperexcep