首页 > 后端开发 > C++ > 正文

如何在没有循环的情况下在 C 中高效地复制向量?

Barbara Streisand
发布: 2024-11-08 16:47:01
原创
159 人浏览过

How to Efficiently Duplicate a Vector in C   Without Loops?

创建向量副本

将向量附加到自身时,出于性能原因,最好避免使用循环。 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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板