草庐IT

stl-algorithm

全部标签

c++ - 我是否应该假设一个对象的析构函数在从 STL 容器中移除后立即被调用?

考虑以下代码:classT{...};//Thasanon-trivialdestructorvoidfoo(){std::vectorv(5);v.pop_back();...}在v.pop_back()之后,STL是否保证T::~T()已经为v.back()?注意:该问题适用于任何移除元素的vector方法(例如resize()、erase()等...)我正在为我的应用程序编写容器类,我希望它们尽可能符合标准库使用的原则。如果我的容器类不做这个保证,有没有风险? 最佳答案 C++11§23.2.3描述了对序列容器的要求。pop_

c++ - STL 容器 move 语义并按值返回 : how many times of copying get avoided away?

我知道在C++11中,move语义已经在STL容器中实现以避免临时对象。人们说现在编写按值返回的函数是完美的。但我对究竟有多少次复制实际上被避免感到困惑。请看下面的例子:vectormyVector(){vectorres;res.push_back(4);res.push_back(5);returnres;}vectorv=myVector();我的理解是在c++03中,myVector返回res的拷贝(4,5复制了一次),在评估vectorv=myVector();时vector的复制构造函数vector(constvector&)被调用(4,5复制了两次)。但是在具有move语

c++ - C++ STL 中 max_element 和 minmax_element 的行为差异

在C++max_element中,如果有多个元素是最大值,则返回第一个这样的元素。而minmax_element(C++11及更高版本)返回最后一个最大元素。这种行为的标准是否有原因?来自cplusplus.comIfmorethanoneequivalentelementhasthelargestvalue,theseconditeratorpointstothelastofsuchelements.Thecomparisonsareperformedusingeitheroperator 最佳答案 Boost的库文档包括rati

c++ - 将函数指针传递给算法时选择正确的重载

问题请耐心等待,这真的只是一个例子:#include#includestructfoo{staticintmy_transform(intx){returnx;}staticstd::vectormy_transform(std::vectorx){std::vectorresult;std::transform(x.begin(),x.end(),std::back_inserter(result),my_transform);returnresult;}};我期望发生什么my_transform有两种可能的重载,但只有一种会导致格式良好的模板实例化,而另一种会导致模板实例化格式错误

C++/STL:std::transform 给定步幅?

我有一个包含Nd数据的一维数组,我想用std::transform或std::for_each有效地遍历它。unignedintnelems;unsignedintstride=3;//wearegoingtohave3Dpointsfloat*pP;//thiswillkeepxyzxyzxyz...Load(pP);std::transform(pP,pP+nelems,strMover(pP,stride));//HowtodefinethestrMover?? 最佳答案 答案不是改变strMover,而是改变你的迭代器。定义

c++ - 如何测量 STL 容器的总内存消耗?

如标题:给定一个STL容器类型的对象(例如std::vector或std::set)我想知道它们的内存消耗---即---消耗了多少内存来存储元素,每个元素的辅助数据和容器大小。我假设存储的对象不分配任何额外的内存。对于std::vectorv我可以添加:sizeof(std::vector)+v.capacity()*sizeof(int)因为vector不为每个元素存储任何辅助数据。但是我该如何为其他容器做呢?我可以忍受非常量时间复杂度。 最佳答案 创建您自己的STLallocator并跟踪放置在其中的内存请求的大小,然后只需添加

采用 STL 样式迭代器的 C++ 虚方法

我想要一个接口(interface)ModelGenerator,它有一个方法generate(),它接受一个可迭代的证据列表并创建一个模型。使用STLpseudo-duck-typing迭代器习惯用法...templateclassModelGenerator{public:templatevirtualboolgenerate(Iteratorbegin,Iteratorend,Model&model)=0;};但是虚函数不能模板化。所以我必须为整个类(class)制作模板:templateclassModelGenerator{public:virtualboolgenerate

c++ - Eclipse CDT 无法解析 STL 容器中元素的方法

我使用EclipseJuno和CDT来开发我的C++项目和自定义makefile。我也在使用C++11功能,我必须按照此处关于SO的建议使用Eclipse的解析器。问题是Eclipse无法解析在STL容器元素上访问的方法或字段。例如:mainapp.htypedefstruct_PlayerCalibrationData{[...]std::stringgetSamplesStr(){[...]}}PlayerCalibrationData;std::vectorm_calibrationData;mainapp.cppm_calibrationData[0].getSamplesSt

c++ - STL 算法可以与循环列表一起使用吗?

为您的自定义列表创建符合STL的迭代器非常普通。然而,如果引用列表是一个循环列表,这似乎毫无意义,因为所有STL算法都在[first,last)范围和循环列表first=last中运行。是否有一种标准/合理的方法来克服这个障碍并让STL算法在“自制”循环列表上运行?我假设定义符合STL的迭代器是实现这一目标的第一步,但也可能有一个可以在范围上运行的解决方案。我需要为大量“自制”结构实现此功能。我当前的解决方案是从boost::iterator_facade派生,然后创建自定义range类(如Rudolph's)并使用围绕基于范围的执行的任何算法。这仍然存在一些逻辑障碍,希望看到可行的替

c++ - 为什么当我使用 std::algorithms 而不是普通循环时这段代码变慢了?

我正在计算vector元素的均值和标准差。我有两个版本,我完全不明白为什么使用标准算法的版本比使用普通循环的版本慢。两个版本都使用这个结构作为返回类型:structMeanAndSigma{doublemean;doublesigma;};带循环的版本是这样的:MeanAndSigmagetMeanAndSigma(constDVector&v){MeanAndSigmams;ms.mean=0;for(inti=0;i还有算法:MeanAndSigmagetMeanAndSigma2(constDVector&v){MeanAndSigmams;ms.mean=std::accumu