草庐IT

stl-algorithm

全部标签

c++ - 不区分大小写的 STL 容器(例如 std::unordered_set)

制作std::unordered_setCASE-INSENSITIVE容器的最短、最跨平台的方法是什么?my_set.insert("Apples");my_set.insert("apples");//Insertdoesn'toccurbecauseofduplicateitem我知道STL提供了Hash和Pred。Hash应该是什么?Pred应该是什么?如果它们不是内置的,那么请提供它们的代码以及它们的使用示例(即我如何声明std::unordered_set?)。由于批评,我将详细说明我正在尝试做的事情。我需要一个高性能的透明HTTP代理服务器,它所做的其中一件事就是快速查找

c++ - STL中分配器是什么意思

我在C++中使用列表类,我不知道这里的分配器是什么意思template>classlist;如果我有listmylist这是否意味着在将元素添加到列表时使用分配器分配整数类型的内存?什么时候需要自定义分配器? 最佳答案 是的。allocator是一种从内存使用中分解内存分配的方法。如果容器需要一些内存,而不是://toorigid,cannotallowcustomallocationschemesvoid*mem=::operatornew(someAmount);你得到://flexible,allowscustomalloca

c++ - STL 随机分布和可移植性

为什么标准分布的结果没有强制要求在实现中保持一致?另一方面,伪随机数生成器的结果是必须是相同的。例如,以下几乎肯定会针对每个不同的标准库实现打印不同的内容。std::mt19937random{100};std::normal_distributiondist;std::cout假设我想进行程序生成,并希望相同的起始种子在跨平台和编译器时产生相同的结果。我不能用STL做到这一点。我必须“回归”使用boost。为什么这不是缺陷? 最佳答案 这不是缺陷,这是设计使然。其基本原理可以在AProposaltoAddanExtensibleR

c++ - 我是否需要在多线程环境中保护对 STL 容器的读取访问?

我有一个std::list容器和这些线程:无限添加元素的编写器线程。一个读取器/写入器线程,在可用时读取和删除元素。访问容器SIZE的多个读取器线程(通过使用size()方法)有一个普通的互斥锁保护前两个线程对列表的访问。我的问题是,大小读取器线程是否也需要获取此互斥量?我应该使用读/写互斥锁吗?我在使用VisualC++6的Windows环境中。更新:看来答案还不清楚。总结一下主要的疑问:考虑到我不需要确切的值(即我可以假设一个+/-1变化)?竞争条件如何使我的size()调用返回无效值(即与好的值完全无关的值)?回答:一般来说,必须保护读取线程以避免竞争条件。尽管如此,在我看来,更

c++ - 从 begin() 迭代到 end() 时,STL 映射是否总是给出相同的顺序?

从我的简单测试来看似乎是这样,但我想知道这是否有保证?是否存在无法保证订购的情况?编辑:我特别感兴趣的情况是,如果我用大量条目填充映射,迭代器的顺序在我的可执行文件的多次运行中是否相同?如果条目以不同的顺序插入怎么办? 最佳答案 是的,它维护了一个内部顺序,所以对一个不变的集合的迭代应该总是相同的。来自here:Internally,theelementsinthemaparesortedfromlowertohigherkeyvaluefollowingaspecificstrictweakorderingcriterionset

c++ - STL:为 vector 写入 "where"运算符

我需要根据几个bool谓词在vector中找到索引。例如:vectorv;vectoridx;idx=where(bool_func1(v),bool_func2(v),...);声明**where**函数的方式是什么,以便在vector上使用几个用户定义的bool函数?谢谢阿曼。一周后编辑我用模板做了一些复杂的解决方案。但实际上,我可以使用已经预定义的valarray来完成我的任务。这是代码片段,也许有人会发现它有用:doubledr=Rc/(double)Nbins,r;sigma.resize(Nbins);rr=sigma;valarrayvz(&data.vz[0],data

c++ - STL 容器函数返回值

在查看STL容器的成员函数时,我想到了一个奇怪的想法。为什么不像std::vector::push_back(T)这样的功能没有(可选的)返回值(迭代器或什至是对附加对象的引用)?我知道std::string像insert这样的功能和erase返回迭代器,但这是出于显而易见的原因。我认为它通常会保存通常跟在这些函数调用之后的第二行代码。我相信C++的设计者有很好的理由,请赐教:)更新:我在这里包含了一个真实的代码示例,它可以减少代码长度:if(m_token!="{"){m_targets.push_back(unique_ptr(newDough(m_token)));returnn

c++ - 将 STL 算法限制为 N 个元素

(灵感来自nakiya的评论)许多STL算法将范围作为一对迭代器。例如,for_each(begin,end,&foo);。显然,如果distance(begin,end)>=N,并且begin是随机访问迭代器,则for_each(begin,begin+N,&foo);应用foo仅对前N个元素。如果这两个条件中的任何一个都不满足,现在是否有一个干净、通用的替代方案? 最佳答案 不改变迭代器类型就没有通用的完整解决方案。证明:假设迭代器类型只是一个InputIterator,所以begin实际上是指(例如)一个流,end是一个特殊情

c++ - C++ STL set容器的count()方法为什么这样命名?

它真正检查的是contains()而不是出现的次数,对吧?也不允许重复,所以contains()不是比count()更好的名字吗? 最佳答案 这是为了使其与其他容器类保持一致,因为多态性的一个重要方面是能够使用相同的API处理不同的类。它确实实际上返回了计数。一个集合的计数只能为零或一个这一事实不会改变这一方面。它与集合对象根本上并没有什么不同,后者只允许同时具有每个“值”的两个事物。在那种情况下,它会返回零、一或二的计数,但它仍然是一个计数,与集合相同。标准的相关部分是C++1123.2.4,其中讨论了关联容器set、multis

c++ - 引用 STL map 元素的值?

是否可以将对map元素值的引用传递给函数,并在那里修改它?foo(string&s){s="xyz";}mapm;m[1]="abc";foo(m[1]);//谢谢。 最佳答案 答案是肯定的。(运算符[]返回reference) 关于c++-引用STLmap元素的值?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/550859/