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);