创建向量副本
将向量附加到自身时,出于性能原因,最好避免使用循环。 std::vector::insert 函数虽然是一个选项,但不允许使用迭代器 *this.
用 std::copy
使用 std::copy 来解决这个问题似乎是一个解决方案,但这种方法可能会导致分段错误。
最优解决方案
最佳解决方案是同时使用resize(或reserve)和copy_n。它的工作原理如下:
auto old_count = xx.size(); xx.resize(2 * old_count); std::copy_n(xx.begin(), old_count, xx.begin() old_count);
这段代码首先将原始向量大小存储在old_count中。然后它调整 xx 的大小以使其容量加倍。最后,std::copy_n 将元素从 xx 的开头复制到 xx 的结尾,从而有效地复制向量。
或者,您可以使用 Reserve 而不是 resize:
auto old_count = xx.size(); xx.reserve(2 * old_count); std::copy_n(xx.begin(), old_count, std::back_inserter(xx));
使用保留时,copy_n 是必需的,因为 end() 迭代器指向末尾之外,使其无效inserts.
此方法满足 23.3.6.5 [vector.modifiers] 中概述的条件,确保插入点之前的迭代器和引用保持有效,并且如果可能的话不会发生重新分配。
免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。
Copyright© 2022 湘ICP备2022001581号-3