用更小的std :: vector替换std :: vector的一部分

时间:2015-01-18 19:21:59

标签: 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);

//中间输入看起来像这样: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不会替换而是放大输入 - &gt;不是我想要的

  • std :: vector :: insert也会创建新元素并使用输入向量,但我确定向量a.size()+ b.size()&lt; = input.size()< / p>

  • std :: vector :: swap不起作用,因为有一些输入内容需要保留在那里(在示例中是最后一个元素)也不能用这种方式添加b
  • std :: vector :: emplace也增加了input.size - &gt;似乎也错了

此外,如果解决方案不会因不必要的清除或将值写回向量a或b而浪费性能,我更愿意。我的向量对于真实来说非常大,这最终是关于性能的。

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

2 个答案:

答案 0 :(得分:6)

你好像在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()时,请确保目标容器足够大,以容纳您要复制的元素数量。

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

答案 1 :(得分:0)

试试这个:

#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