C++11 用较小的std::vector替换部分std::vector

C++11 用较小的std::vector替换部分std::vector,c++11,vector,replace,stdvector,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

我想知道用另一个更小的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.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()似乎也错了

另外,我更希望解决方案不会因为不必要的清除或将值写回向量a或b而浪费性能。我的向量将是非常大的真实,这是关于性能在最后

非常感谢任何有能力的帮助。

试试以下方法:

#include <iostream>
#include <vector>
#include <algorithm>

int main() {
    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::set_union( a.begin(), a.end(), b.begin(), b.end(), input.begin() );

    for ( std::vector<int>::const_iterator iter = input.begin();
          iter != input.end();
          ++iter )
    {
        std::cout << *iter << " ";
    }

    return 0;
}
你好像在找我。这是您在示例()中使用它的方式:

这样,就不再需要随机访问迭代器了——当我们使用表达式
std::begin(input)+a.size()
时就是这样

std::copy()
的前两个参数表示要复制的元素的源范围。第三个参数是要在目标容器中覆盖的第一个元素的迭代器

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


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

您在寻找什么?如果我正确理解了你的问题(不确定),那么应该是你想要的。如果是的话,让我知道,我会把它作为一个答案贴出来。这似乎是我想要的,尽管我并不完全理解它。具有输出副本(先输入,后输入,先输出);是不是:first=a.beginn(),last=a.end()我还不是100%确定,但这似乎不是正确的答案。我不能保证a和b总是按顺序排列的,也不能保证需要保留的输入元素比以前的所有元素都大。此外,我希望保持最小的写入和内存位置,因为我可能会使用非常非常大的向量。重用输入可以节省时间从额外的内存分配中删除我,因为输出将具有与输入完全相同的大小,到那时不再需要。好的,没问题。无论如何,我将保留此答案…除非我获得否决票…感谢您的评论!可以通过替换
std::begin(input)+a.size()使代码更通用
的第一次调用的返回值为
std::copy
。即使迭代器不是随机访问迭代器(),它也能工作。
#include <iostream>
#include <vector>
#include <algorithm>

int main() {
    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::set_union( a.begin(), a.end(), b.begin(), b.end(), input.begin() );

    for ( std::vector<int>::const_iterator iter = input.begin();
          iter != input.end();
          ++iter )
    {
        std::cout << *iter << " ";
    }

    return 0;
}
1 2 3 4 5 6 7 8 99 
#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());
auto last = std::copy(std::begin(a), std::end(a), std::begin(input));
std::copy(std::begin(b), std::end(b), last);