将矢量末尾的擦除优化为调整大小

Optimizing erase from the end of vector into resize

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

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

进入:

std::vector<T> my_vec(10);
//some code
my_vec.resize(5);

我问是因为我总是读到 std::vector::resize 在从 std::vector::erase 的末尾擦除时更可取。但是,我发现 std::vector::erase 更具可读性。

进行此类优化是否合法且可能?是的。规范中没有任何内容禁止将一个转换为另一个。因此,从 vector 末尾的 erase 操作根据收缩 resize.

的胆量来实施是合法的

类型要求不同

  • vector::resize(单参数版本)不需要 MoveAssignable 但确实需要 DefaultInsertableMoveInsertable,因为它也可以用于种植容器。

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

  • vector::pop_back 需要上面的 none,但一次只弹出一个元素,所以你将不得不多次调用它。

在任何理智的实施中都不应存在可察觉的性能差异。