草庐IT

stl-algorithm

全部标签

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

c++ - 有状态仿函数和 STL : Undefined behaviour

我正在关注这个Functionobjectstutorial复制下面的意大利面:我无法理解以下内容:谓词应始终作为无状态函数对象来实现,以避免意外结果。无法保证算法在内部复制谓词的频率。因此,将谓词实现为有状态函数对象可能会产生意外结果。例子如下:#include#include#include#includeclasspredicate{public:predicate(intcondition):condition_(condition),state_(0){}booloperator()(int){return++state_==condition_;}private:intco

c++ - 只读结构中数据成员的分配,STL 集中的类

下面复制了我遇到的问题的最小示例:#includeusingnamespacestd;classfoo{public:intvalue,x;foo(constint&in_v){value=in_v;x=0;}booloperatorF;F.insert(y);//NowtrytomodifyamemberofthesetF.begin()->x=1;return0;}出现错误错误:在只读结构中分配数据成员‘foo::value’。我觉得我在这里遗漏了一些简单的东西,但为什么我无法在我的类中修改成员x? 最佳答案 set中的对象是不

c++ - 调整 STL vector 的大小是否会删除/使其以前的内容无效?

(示例程序)似乎没有,但我可以确定吗?//doesresizinganSTLvectorerase/invalidateit'spreviouscontents?#include#includeusingnamespacestd;voidprint(vector&t){for(inti=0;it;t.resize(12,9999);print(t);t.resize(15,10000);print(t);} 最佳答案 调整STLvector的大小可能需要重新分配底层存储。这可能会导致任意数量的元素被销毁和重新创建,并且所有迭代器都失