草庐IT

stl_algobase

全部标签

c++ - 如何在 DLL 边界上公开 STL 列表?

我有一个DLL,它需要访问存储在主机应用程序的STL容器中的数据。因为C++没有标准的ABI,而且我想支持不同的编译器,所以应用程序和DLL之间的接口(interface)基本上必须保持纯旧数据。对于vector,这是相对简单的。您可以简单地返回vector的内存块,因为它保证是连续的://ToreturnvectordatavirtualvoidGetVectorData(constint*&ptr,size_t&count)const{if(!vec.empty())ptr=&(vec.front());count=vec.size();}现在DLL可以通过该接口(interfac

c++ - STL(标准模板库)中使用的设计模式

我正在学习STL和设计模式。我想知道是否有任何文档或链接解释了如何在STL中实现设计模式我做了谷歌,但无法获得太多数据 最佳答案 我希望你的意思是,“哪些设计模式可以在STL中识别”。STL栈是一个容器适配器。适配器是一种设计模式。迭代器也是一种设计模式。STL函数对象与命令模式相关。模式:适配器(容器适配器)堆栈队列优先队列迭代器Command+Adapter(函数适配器)Iterator+Adapter(迭代器适配器)反向迭代器插入迭代器流迭代器模板方法(使用用户指定函数的STL算法)哪种创作模式?(分配器)这些模式的实现方式与

c++ - 带空字符的 STL basic_string 长度

为什么您可以在std::basic_string中插入一个'\0'字符并且.length()方法不受影响,但是如果您调用char_traits::length(str.c_str())你得到字符串的长度直到第一个'\0'字符?例如stringstr("abcdefgh");cout::length(str.c_str());//4 最佳答案 好问题!原因是C风格的字符串被定义为以空字节结尾的字节序列。当您使用.c_str()从C++中获取C风格的字符串std::string,然后您将返回C++字符串存储的序列,其后有一个空字节。当您

c++ - 在没有原始循环的情况下将数据添加到 STL 容器

我经常看到您可以用STL算法替换所有手写/原始循环。只是为了提高我的C++知识,我一直在尝试这样做。为了用数据填充std::vector,我使用了for循环和循环索引。unsignedintbuffer_size=(format.getBytesPerSecond()*playlen)/1000;//pcmdatastoredina'shorttype'vectorvectorpcm_data;for(unsignedinti=0;i(amplitude*sin((2*M_PI*i*frequency)/format.SampleRate)));}上面的代码工作正常,正如你所看到的,我

c++ - 包含引用的 STL 映射无法编译

以下内容:std::maptest;给出:errorC2101:'&'onconstant虽然下面std::maptest;给予errorC2528:'_First':pointertoreferenceisillegal后者似乎map不能包含键值的引用,因为它有时需要实例化类,而没有对象就无法实例化引用。但为什么第一种情况不起作用? 最佳答案 在STL容器中存储引用是非法的,因为类型必须是可复制构造和可赋值的。无法分配引用。究竟是什么操作导致第一个错误取决于实现,但我认为它与创建引用而不是立即分配它有关。第二条错误消息看起来实际上

c++ - STL 前后递增运算符的概念区别

据说:for(vector::iteratoriter=ivec.begin();iter!=ivec.end();++iter){}我确实理解像int等内置类型的前/后增量的区别,但就迭代器而言,++iter和iter++?(请记住,我确实知道两者在这里会产生相同的结果)。 最佳答案 ++iter最有可能比iter++更快但绝不会慢。实现后自增运算符iter++需要生成一个额外的临时对象(这个临时对象在原iter自增时返回++)超过实现后增量运算符++iter,因此除非编译器可以优化(是的,它可以)后增量,否则++iter很可能比

c++ - STL自定义分配器来管理不同的内存空间

我想使用STL自定义分配器类的不同实例来管理不同的内存空间,然后能够为STL容器指定一个分配器实例,以便每个容器仅从其分配的内存空间中提取。但我不知道我该怎么做。我看到了如何将分配器类型传递到STL容器的模板参数中,但我想要类似于将分配器实例传递到STL容器的构造函数中的方法。有没有办法在STL中做到这一点? 最佳答案 不幸的是,STL分配器不能有状态(或者至少必须非常小心如何使用该状态)-特定分配器类型的每个实例都必须等效,STL容器才能有效地与它们一起工作。我现在不记得细节,但我知道ScottMeyers在"EffectiveS

c++ - 为什么 C++ STL 中的算法、迭代器和容器是分离的

我不明白为什么他们在C++STL中将算法、迭代器和容器分开。如果在任何地方都大量使用模板,那么我们可以使用模板参数将所有内容集中在一个地方的类。我收到的一些文本解释说迭代器有助于算法与容器数据交互,但如果容器公开某种机制来访问它拥有的数据怎么办? 最佳答案 与M容器+N算法,通常需要M*N代码片段,但迭代器充当“胶水”,这可以减少到M+N代码片段。示例:在3个容器上运行2个算法std::listl={0,2,5,6,3,1};//C++11initializerlistsstd::vectorv={0,2,5,6,3,1};//C+

c++ - STL + 有序集 + 无重复

我需要一组没有重复的有序值。那么,什么是最快/最好的方法:1-创建一个vector,对其进行排序并删除重复项?2-使用一种“排序”vector(如果存在)?哪个效率更高? 最佳答案 你为什么不使用std::set? 关于c++-STL+有序集+无重复,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/4463285/

c++ - 将动态数组包装到 STL/Boost 容器中?

我需要将动态分配的数组(例如来自a=newdouble[100])包装到std::vector(最好)而不复制数组。此限制是由于我要包装的数组是从文件中映射而来的,因此只需执行vector(a,a+size)就会使内存使用量加倍。有什么技巧可以做到吗? 最佳答案 最好的解决方案之一是STLSoft'sarray_proxy。模板。不幸的是,doxygen从源代码生成的文档页面对理解模板没有多大帮助。源代码实际上可能更好一些:http://www.stlsoft.org/doc-1.9/array__proxy_8hpp-source