C++ 优化从矢量末尾擦除到调整大小

C++ 优化从矢量末尾擦除到调整大小,c++,c++11,vector,compiler-optimization,C++,C++11,Vector,Compiler Optimization,编译器优化此代码是否合法且可能: std::vector<T> my_vec(10); //some code my_vec.erase(my_vec.begin()+5,my_vec.end()); std::vector my_vec(10); //一些代码 my_vec.erase(my_vec.begin()+5,my_vec.end()); 进入: std::vector my_vec(10); //一些代码 我的向量调整(5); 我这样问是因为我总是读到,当从末尾擦

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

std::vector<T> my_vec(10);
//some code
my_vec.erase(my_vec.begin()+5,my_vec.end());
std::vector my_vec(10);
//一些代码
my_vec.erase(my_vec.begin()+5,my_vec.end());
进入:

std::vector my_vec(10);
//一些代码
我的向量调整(5);

我这样问是因为我总是读到,当从末尾擦除时,
std::vector::resize
优于
std::vector::erase
。然而,我发现
std::vector::erase
更具可读性。

这种优化是否合法且可能发生?对规范中没有禁止将一个转换为另一个。因此,从
向量
末尾执行
擦除
操作是合法的,可以根据缩小的
大小

类型要求不同

  • vector::resize
    (单参数版本)不需要
    MoveAssignable
    ,但需要
    DefaultInsertable
    MoveInsertable
    ,因为它也可以用于增加容器

  • vector::erase
    则相反;它要求<代码>可移动的< /代码>,而不是其他代码,因为它可以用来在中间擦除。

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


在任何合理的实现中都不应该存在明显的性能差异。

您认为哪一个方面更可取,其基本原理是什么?我在一些SO答案中看到了这一点,作为旁注。。我不记得原因是什么,甚至不记得有人提到过原因。也许我应该先问问它是否真的更好:)@HumamHelfawi:不,为什么你认为
擦除
看起来更好?这两个调用几乎肯定会做同样的事情-所以你喜欢哪个就做哪个。@Barry不,不是这样。等等,
调整大小
在哪里指定相反的顺序?@T.C.:是的,我也觉得很奇怪。它是根据一系列
pop_back
调用定义的:“如果
sz-Oh。也只影响C++14。非常有用。感谢您有理由让
std::vector::shrink\u by
,它与
pop\u back
匹配。我怀疑
pop\u back
循环的效率可能低于
shrink\u by
循环的效率,但可能不是:如果对象的某个析构函数抛出,该怎么办?@Yakk UB,像往常一样。将抛出析构函数与标准库一起使用是非常困难的。
std::vector<T> my_vec(10);
//some code
my_vec.resize(5);