std :: vector :: erase(迭代器位置)不一定会调用相应元素的析构函数

ROT*_*OGG 6 c++ stl

假设我有std::vector V5个元素,

V.erase(V.begin() + 2) 删除第3个元素.

STL vector实现将向上移动第4和第5个元素,然后破坏第5个元素.

即在e中删除元素ivector并不保证调用第i个析构函数.因为std::list,事实并非如此.擦除ith元素调用ith元素的析构函数.

STL对这种行为有什么看法?

这是从我的系统的stl_vector.h获取的代码:

392   iterator erase(iterator __position) {
393     if (__position + 1 != end())
394       copy(__position + 1, _M_finish, __position);
395     --_M_finish;
396     destroy(_M_finish);
397     return __position;
Run Code Online (Sandbox Code Playgroud)

jua*_*nza 2

与 不同的是std::liststd::vector它的元素是连续的。因此,当从容器中间删除一个元素时,复制分配所有需要移动的元素会更有意义。在这种情况下,将调用最后一个移位元素的析构函数。这避免了向量的整个数据的重新分配。