c++11 - 用较小的 std::vector 替换 std::vector 的一部分

标签 c++11 vector replace stdvector

我想知道用另一个较小的 std::vector 替换(覆盖)给定 std::vector “输入”的一部分的正确方法是什么?
我确实需要保持原始向量的其余部分不变。
我也不需要打扰原始向量中的内容和
之后我不再需要保留较小的向量。
说我有这个:

std::vector<int> input = { 0, 0, 1, 1, 2, 22, 3, 33, 99 };
std::vector<int> a = { 1, 2, 3 };
std::vector<int> b = { 4, 5, 6, 7, 8 };
我想实现这一目标:
input = { 1, 2, 3, 4, 5, 6, 7, 8, 99}
正确的做法是什么?我想到了类似的东西
input.replace(input.beginn(), input.beginn()+a.size(), a);
// intermediate input would look like that: input = { 1, 2, 3, 1, 2, 22, 3, 33, 99 };

input.replace(input.beginn()+a.size(), input.beginn()+a.size()+b.size(), b);
应该有一个标准的方法来做到这一点,不是吗?
到目前为止,我对此的想法如下:
  • 我不能使用 std::vector::assign 因为它会破坏输入的所有元素
  • std::vector::push_back 不会替换而是放大输入 --> 不是我想要的
  • std::vector::insert 还会创建新元素并放大输入向量,但我确定向量 a.size() + b.size() <= input.size()
  • std::vector::swap 不起作用,因为有一些输入内容需要保留在那里(在示例中是最后一个元素),也无法以这种方式添加 b
  • std::vector::emplace 也增加了 input.size -> 似乎也是错误的

  • 此外,我希望解决方案不会通过不必要的清除或将值写回向量 a 或 b 来浪费性能。我的向量实际上会非常大,这最终与性能有关。
    任何称职的帮助将不胜感激。

    最佳答案

    你似乎在追 std::copy() .这是您在示例中使用它的方式( live demo on Coliru ):

    #include <algorithm> // Necessary for `std::copy`...
    
    // ...
    
    std::vector<int> input = { 0, 0, 1, 1, 2, 22, 3, 33, 99 };
    std::vector<int> a = { 1, 2, 3 };
    std::vector<int> b = { 4, 5, 6, 7, 8 };    
    
    std::copy(std::begin(a), std::end(a), std::begin(input));
    std::copy(std::begin(b), std::end(b), std::begin(input) + a.size());
    

    正如 Zyx2000 注释 in the comments ,在这种情况下,您还可以使用第一次调用 std::copy() 返回的迭代器。作为下一个副本的插入点:
    auto last = std::copy(std::begin(a), std::end(a), std::begin(input));
    std::copy(std::begin(b), std::end(b), last);
    

    这样,不再需要随机访问迭代器——当我们有表达式 std::begin(input) + a.size() 时就是这种情况。 .
    std::copy() 的前两个参数表示要复制的元素的源范围。第三个参数是指向目标容器中要覆盖的第一个元素的迭代器。

    使用时 std::copy() ,请确保目标容器足够大以容纳您要复制的元素数量。

    此外,源和目标范围不应交错。

    关于c++11 - 用较小的 std::vector 替换 std::vector 的一部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28013793/

    相关文章:

    javascript - 使用 JS .split 并多次连接数组。它只运行最后一对

    javascript - 如何使用 javascript 在正则表达式替换中表示大括号

    python - 使用 python 编译 caffe 的问题,对 `std::__cxx11::....' 的 undefined reference

    c++11 - 将 std::shared_ptr<T> 转换为 void*

    c++ - 如何检查 vector 是否指向 C++ 中二维 vector 中的空 vector ?

    c++ - 巨大的 vector "hangs"程序? (50000 x 50000 个细胞)

    c++ - 为什么 vector 迭代器指向越界?

    c++ - 根据某些标准拆分 std::vector

    c++ - 使用大括号括起来的初始化列表初始化结构 vector

    php - 替换多个 PHP 实例