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

时间:2016-06-01 18:18:21

标签: 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<T> my_vec(10);
//some code
my_vec.resize(5);

我在问,因为我总是看到std::vector::resizestd::vector::erase结尾擦除时更好。但是,我发现std::vector::erase更具可读性。

2 个答案:

答案 0 :(得分:9)

类型要求不同。

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

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

  • vector::pop_back不需要上述内容,但一次只会弹出一个元素,因此您必须多次调用它。

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

答案 1 :(得分:1)

这种优化是否合法且可能发生?是。规范中没有任何内容禁止将一个转换为另一个。因此,erase的{​​{1}}操作从vector缩小resize的内容来实现是合法的。