草庐IT

stl_algobase

全部标签

c++ - 关于使用用户定义方法扩展 C++ STL 容器的更好方法的建议

我继承自C++STL容器并向其添加我自己的方法。其基本原理是,对于客户来说,它看起来像是一个常规列表,但具有可以很容易地调用的特定于应用程序的方法。这很好用,但我读过很多关于不从STL继承的帖子。有人可以就我如何以更好的方式编写下面的代码提供具体建议吗?classItem{inta;intb;intc;intSpecialB(){returna*b+c;}};classItemList:publicstd::vector{intMaxA(){if(this->empty())throw;intmaxA=(*this)[0].a;for(intidx=1;idxsize();idx++)

c++ - 将 STL 容器与迭代器一起使用的常见误用是什么?

就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter寻求指导。关闭11年前。STL的常见误用有哪些?带有迭代器的容器? 最佳答案 忘记如果您通过插入或删除容器成员来更改容器,迭代器通常会失效。对于使用STL的许多重要提示,我强烈推荐ScottMeyers的书“EffectiveSTL”(sanitisedAmazonlink)

c++ - 如果类型为 noexcept,C++ 11 STL 中的哪些算法和容器可以运行得更快?

在工作中出现了关于使用noexcept有多少关心的争论。我们都知道noexcept并没有真正为编译器的优化器做很多事情,除了编译器必须假设的外部定义的代码可能会抛出,因为它不知道它的实现,所以标记事物的唯一真正的其他性能优势noexcept用于使用std::move_if_noexcept的代码假设主要是STL容器及其算法。因此评估是这样的:不使用noexcept,除非:编译器不知道可调用的实现的外部函数和类。移动构造函数、移动赋值运算符并交换任何可能包含在STL容器中的类型。否则别担心。这是一个公平的评估吗?如果某些东西不是异常(exception),STL中是否还有其他地方可以生成

c++ - 为什么 sgi STL 源代码在 operator new 函数前面使用双冒号?

我正在阅读SGI标准模板库的源代码。我发现operatornew函数前面总是有一个双冒号。像这样:T*tmp=(T*)(::operatornew((size_t)(size*sizeof(T))));operatornew可以不加::字段直接调用,那为什么STLcoder会这样写呢?如果我们不使用它们前面的::,可能会遇到什么陷阱或情况。 最佳答案 您可以为类重载operatornew并在其前面加上"::"将调用全局"default"operatornew而不是可能的重载。例如:#includeclassFoo{public:Fo

c++ - EASTL与STL,std::vector<uint64_t>::operator[]怎么会有这么大的性能差异

根据http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2271.htmlvector::operator[]在EASTL中比“常用的STL商业版本”快2%到70%。除非商业版的STL使用范围检查,否则比较不公平,这么简单的操作怎么可能有这么大的速度差异?更新:似乎答案是EA工程师只是通过与使用范围检查的版本进行比较来作弊...... 最佳答案 文档指出他们使用VC++2005进行Windows测试,checkediterators是enabledbydefault(是的

c++ - 验证 STL 文件是 ASCII 还是二进制

看完specs关于STL文件格式,我想写一些测试来确保文件实际上是有效的二进制或ASCII文件。一个基于ASCII的STL文件可以通过在字节0找到文本“solid”,后跟一个空格(十六进制值\x20),然后可选文本字符串,后跟换行符。二进制STL文件有一个保留的80字节header,后跟一个4字节无符号整数(NumberOfTriangles),然后50个字节的数据,用于指定的每个NumberOfTriangles个方面。每个三角形面的长度为50字节:12个单精度(4字节)float,后跟一个无符号短(2字节)无符号整数。如果二进制文件的长度正好是84+NumberOfTriangle

c++ - Fortran 中的 STL 类似物

基础:我有非常大的并行Fortran90/MPI程序,代表复杂的物理模型。我想为其添加新功能:例如,我需要组织消息队列,在某处引入合并排序并使用哈希表。问题:我自己知道如何编写哈希表、创建队列和代码归并排序,但我认为发明自行车不是一个好主意。问题:在这种情况下,Fortran大师应该怎么做?我应该从Fortran构建与C++类的绑定(bind)并使用STL在那里实现逻辑,还是您可以建议一些类似FortranSTL的库?谢谢。 最佳答案 Fortran中没有模板,因此没有STL。你可以试试FLIBS对于一些通用库。它一般使用trans

c++ - std::addressof 是否否定 STL operator& 要求?

为了使类型与C++03标准库“很好地配合”,重载operator&()被认为是一个坏主意,因为地址需要正确使用类型和重载它会产生意想不到的问题;这里的经典示例是ATL::CComBSTR。随着std::addressof()在C++11及更高版本中的出现,这是否否定了对标准库中使用的类型的旧要求?是否在C++11的标准中明确说明(或从中删除)要求,即规范是否要求标准库使用std::addressof()? 最佳答案 容器的value_type只有几个要求。它们主要取决于容器,但对于一般情况,要求至少是MoveConstructibl

c++ - 使用 STL 容器时应该使用 int 还是 unsigned int?

引用本指南:https://google.github.io/styleguide/cppguide.html#Integer_Types谷歌建议使用int在大部分时间。我尝试遵循本指南,唯一的问题是STL容器。示例1。voidsetElement(intindex,intvalue){if(index>someExternalVector.size())return;...}比较index和.size()正在生成警告。示例2。for(inti=0;ii之间的相同警告和.size().如果我声明index或i如unsignedint,警告已关闭,但类型声明会传播,然后我必须将更多变量声

c++ - 未使用的 STL 容器是否分配内存?

给定代码:classFoo{std::vectoritems;std::mapdictionary;};如果上述vector或映射中没有添加任何内容,是否仍会分配一block缓冲内存?(换句话说,缓冲区分配是否总是在容器创建期间发生,还是可以推迟到调用push_back之类的函数?)是否有处理初始STL容器缓冲区分配时间的标准,或者该行为是否允许在STL容器和编译器之间有所不同?注意:这个问题不是关于这些容器会增加类Foo大小的额外字节。(这个问题的一个相关子集,强调分配大小是InitialcapacityofvectorinC++。) 最佳答案