C++03中使用std::vector::insert将vector插入自身是否符合标准?
C++03标准下std::vector自追加行为说明
无预留容量时直接自追加是否合法安全
C03标准不支持也不保证该操作的安全性,属于未定义行为。
C03标准23.2.4.3节对vector::insert的要求明确规定,输入迭代器区间[first, last)不能指向调用insert的vector本身。你当前使用的STL实现会先分配新内存再复制、最后释放旧内存,属于厂商的自定义兼容实现,完全不具备可移植性,不能依赖该行为,更换STL实现(比如部分旧版本libstdc++、特殊配置的stlport)就可能出现内存访问错误、数据错乱的问题。
对应代码行为完全不可靠:
vector<int> v; v.reserve(3); v.push_back(1); v.push_back(2); v.push_back(3); // v可能需要重新分配内存,因为其容量可能小于6,该操作是否安全? v.insert(v.end(), v.cbegin(), v.cend());
先执行v.reserve(2 * v.size())再自追加是否可行
该方案是安全可依赖的。
当你调用reserve将容量扩容到至少2倍当前元素数后,后续insert操作不会触发内存重分配,原有元素的迭代器全程有效。且你选择的插入位置是v.end(),插入过程不会修改原有区间[v.cbegin(), v.cend()]里的元素,复制过程完全合法。
该场景下的代码符合标准要求,行为可预期:
// 此处v有足够容量,不需要重新分配内存,该操作是否安全? v.reserve(2 * v.size()); v.insert(v.end(), v.cbegin(), v.cend());
补充兼容方案
如果担心reserve参数计算出错,也可以先构造临时副本再插入,兼容性更强:
vector<int> tmp(v.begin(), v.end()); v.insert(v.end(), tmp.begin(), tmp.end());
内容的提问来源于stack exchange,提问作者Fabian
相关产品推荐
相关产品推荐

