创建向量副本
将向量附加到自身时,出于性能原因,最好避免使用循环。 std::vector::insert 函数虽然是一个选项,但不允许使用迭代器 *this。
使用 std::copy 解决问题
使用 std::copy 来解决这个问题似乎是一个解决方案,但这种方法可能会导致分段错误。
最佳解决方案
最佳解决方案包括同时使用调整大小(或保留)和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 而不是调整大小:
auto old_count = xx.size(); xx.reserve(2 * old_count); std::copy_n(xx.begin(), old_count, std::back_inserter(xx));
使用 Reserve 时,copy_n 是必需的,因为 end() 迭代器指向末尾之外,使其对于插入无效。
这种方法满足 23.3.6.5 [vector.modifiers] 中概述的条件,确保迭代器和插入点之前的引用仍然有效,并且如果可能的话不会发生重新分配。
以上是如何在没有循环的情况下在 C 中高效地复制向量?的详细内容。更多信息请关注PHP中文网其他相关文章!