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

Hum*_*awi 3 c++ vector c++11

据我所知,如果向量的顺序并不重要,它是更快地使用了swap- 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();
Run Code Online (Sandbox Code Playgroud)

前面的示例避免复制许多元素.

从同样的角度来看,如果我想打电话给std::vector::erase一个范围是代表最后n的一个项目std::vector,就对它进行优化,并且表现得像多pop_back

例:

auto it = std::find(my_vec.begin(),my_vec.end(),SOME_VALUE);
my_vec.erase(it,my_vec.end()); // Erase everything from 'it' and beyond
Run Code Online (Sandbox Code Playgroud)

leg*_*s2k 5

如果我调用std::vector::erase代表a的最后n项的范围std::vector,它会被优化并且表现得像多pop_back吗?

如果我理解你的话,那么担心这里的问题就是不应该像中间的擦除那样进行任何重复操作.如果是这种情况,标准保证(强调我的):

复杂

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

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

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