在擦除std :: vector中的n个最后项时是否进行了优化

时间:2016-03-08 09:23:10

标签: c++ c++11 vector

据我所知,如果向量的顺序不重要,使用<Target AfterTargets="AfterBuild"> <Exec Command="$(ProjectDir)$(OutputPath)$(AssemblyName).$(OutputType)" /> <Copy SourceFiles="$(ProjectDir)$(OutputPath)file.db" DestinationFolder="$(SolutionDir)Test" /> </Target> - swap惯用法从{{移除单项会更快1}}。例如:

pop_back

上一个示例避免复制许多元素。

从同样的角度来看,如果我想在代表std::vector的最后auto it = std::find(my_vec.begin(),my_vec.end(),SOME_VALUE); std::swap(*it,my_vector.back()); my_vector.pop_back(); 项的范围内调用std::vector::erase,它是否会被优化并且表现得像多n 1}}?

示例:

std::vector

2 个答案:

答案 0 :(得分:5)

  

如果我在代表std::vector::erase的最后n项的范围内调用std::vector,是否会进行优化并且表现得像多pop_back

如果我理解你的话,请认为这里的担心不应该是任何重置操作,如中间的擦除。如果是这种情况,standard guarantees(强调我的):

  

复杂性

     

第一个和最后一个之间距离的线性,加上容器的最后一个和最后一个距离的线性

强调部分用于重新安置。但是,由于这是零,因此从背面移除元素不会产生任何费用。

值得做的是反汇编某些此类代码的优化输出,看看这是否只是工具链中的指针赋值/减量操作。

答案 1 :(得分:1)

  

据我所知,如果向量的顺序不重要,使用swap-pop_back成语从std :: vector中删除会更快。

不确定你的意思。涉及多次回拨的任何事情都不可能是最佳的。

  

从同样的角度来看,如果我在一个代表std :: vector的最后n项的范围内调用std :: vector :: erase,那么它会被优化吗

这取决于库的实现,但几乎可以肯定。

  

并且表现得像多个pop_back?

没有