将矢量末尾的擦除优化为调整大小
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
但确实需要 DefaultInsertable
和 MoveInsertable
,因为它也可以用于种植容器。
vector::erase
是相反的;它需要 MoveAssignable
而不是其他的,因为它可以用来在中间擦除。
vector::pop_back
需要上面的 none,但一次只弹出一个元素,所以你将不得不多次调用它。
在任何理智的实施中都不应存在可察觉的性能差异。
编译器优化这段代码是否合法且可能:
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
但确实需要DefaultInsertable
和MoveInsertable
,因为它也可以用于种植容器。vector::erase
是相反的;它需要MoveAssignable
而不是其他的,因为它可以用来在中间擦除。vector::pop_back
需要上面的 none,但一次只弹出一个元素,所以你将不得不多次调用它。
在任何理智的实施中都不应存在可察觉的性能差异。