优化从矢量结束擦除到调整大小

Hum*_*awi 2 c++ vector compiler-optimization c++11

编译器优化此代码是否合法且可能:

std::vector<T> my_vec(10);
//some code
my_vec.erase(my_vec.begin()+5,my_vec.end());
Run Code Online (Sandbox Code Playgroud)

成:

std::vector<T> my_vec(10);
//some code
my_vec.resize(5);
Run Code Online (Sandbox Code Playgroud)

我在问,因为我总是读到std::vector::resize从最后擦除时更好std::vector::erase.但是,我认为这std::vector::erase更具可读性.

T.C*_*.C. 9

类型要求不同.

  • vector::resize(单参数版本)不要求MoveAssignable,但要求DefaultInsertableMoveInsertable,因为它也可以用来种植容器.

  • vector::erase是相反的; 它需要MoveAssignable但不需要其他,因为它可以用来擦除中间.

  • vector::pop_back 不需要上述任何一项,但一次只能弹出一个元素,因此您必须多次调用它.

在任何理智的实现中都不应该存在可感知的性能差异.