编译器优化此代码是否合法且可能:
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
更具可读性。
答案 0 :(得分:9)
类型要求不同。
vector::resize
(单参数版本)不需要MoveAssignable
但需要DefaultInsertable
和MoveInsertable
,因为它也可以使用种植容器。
vector::erase
正好相反;它需要MoveAssignable
而不是其他,因为它可以用来擦除中间。
vector::pop_back
不需要上述内容,但一次只会弹出一个元素,因此您必须多次调用它。
任何理智的实施都不应该存在可察觉的性能差异。
答案 1 :(得分:1)
这种优化是否合法且可能发生?是。规范中没有任何内容禁止将一个转换为另一个。因此,erase
的{{1}}操作从vector
缩小resize
的内容来实现是合法的。