You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在C++中用小std::vector填充大std::vector?

高效重复填充std::vector的实现方法

首先要纠正你现有代码的一个问题:你示例里的dst已经初始化了9个元素,但你的嵌套循环用emplace_back会在容器末尾追加元素,最终dst的大小会变成12,完全不符合你想要的结果。如果是要覆盖预分配的元素,得改用索引赋值或者直接覆盖迭代器指向的位置。

下面是几种更高效的实现方案,按推荐程度排序:

1. 多次调用std::copy_n

这是最简洁且高效的方案,因为标准库的std::copy_n针对不同类型做了极致优化——比如对于int这类POD类型,会直接调用memcpy进行批量内存拷贝,比手动循环快得多。

std::vector<int> src = {1, 2, 3};
std::vector<int> dst(9);

const auto src_size = src.size();
const auto repeat_times = dst.size() / src_size;
auto dst_it = dst.begin();

for (std::size_t i = 0; i < repeat_times; ++i) {
    dst_it = std::copy_n(src.begin(), src_size, dst_it);
}

2. 用std::generate_n生成重复序列

这个方案代码更紧凑,适合需要动态生成元素的场景,std::generate_n同样会被编译器优化,性能和std::copy_n接近:

std::vector<int> src = {1, 2, 3};
std::vector<int> dst(9);

auto src_it = src.begin();
std::generate_n(dst.begin(), dst.size(), [&]() {
    if (src_it == src.end()) {
        src_it = src.begin();
    }
    return *src_it++;
});

3. POD类型专属:直接用memcpy批量复制

如果你的元素是POD类型(比如int、float这类没有自定义构造/析构的类型),可以直接用底层内存拷贝操作,跳过元素级别的赋值,效率拉满:

std::vector<int> src = {1, 2, 3};
std::vector<int> dst(9);

const auto src_size = src.size();
const auto repeat_times = dst.size() / src_size;
const auto src_data = src.data();
auto dst_data = dst.data();
const std::size_t copy_bytes = src_size * sizeof(int);

for (std::size_t i = 0; i < repeat_times; ++i) {
    std::memcpy(dst_data + i * src_size, src_data, copy_bytes);
}

对比你的现有方案

  • 你的嵌套循环如果改成索引赋值(比如dst[i*src_size + j] = src[j]),性能会远不如标准库算法,因为编译器很难对嵌套循环做批量优化。
  • 单循环用std::copy的思路其实和std::copy_n方案类似,但std::copy_n的代码更清晰,也更符合标准库的使用习惯。

内容的提问来源于stack exchange,提问作者IceCoconut

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 14:43:09