在另一个向量中的特定位置插入一个向量

3
我想将向量b插入到向量a的特定位置。例如:
std::vector <int> vecta{ 10, 20, 30 ,40 , 50};
std::vector <int> vectb{ 1000, 2000, 3000 };

我该如何使结果向量为 {10,20,1000,2000,3000,40,50} ? 我想要删除 30 并用这个向量替换它。

A是主向量,B是另一个计算过程的结果。我想用B的值修改A。 - Hazem Abaza
3个回答

6
我希望在向量a的特定位置插入向量b。您可以考虑使用std :: vector :: insert():
vecta.insert(pos, vectb.begin(), vectb.end());

其中,pos 是一个迭代器,指向 vecta 中将要插入 vectb 内容之前的元素。 pos 也可以是由 end() 返回的迭代器,这意味着将 vectb 的内容 追加vecta 中。


如何使结果向量为 {10,20,1000,2000,3000,40,50}?

为此,您还需要从 vecta 中删除元素 30。 您可以使用 std::vector::erase() 实现:

auto main() -> int {
   std::vector <int> vecta{ 10, 20, 30, 40 , 50};
   /*                               ^
                                    |-- insert vectb here and replace the 30
   */

   std::vector <int> vectb{ 1000, 2000, 3000 };

   // what element to erase from vecta?
   auto pos = vecta.begin() + 2;

   // erase it
   pos = vecta.erase(pos);

   // insert vectb in vecta
   vecta.insert(pos, vectb.begin(), vectb.end());

   for (auto& e: vecta)
      std::cout << e << " ";
   std::cout << std::endl;
}

std::vector::erase()函数返回被移除元素的下一个迭代器。因为你想要从vecta中删除30,并在该位置插入vectb,所以你可以将erase()返回的迭代器直接传递给insert()函数。


3

您可以使用erase删除特定迭代器位置处的元素,使用insert在特定迭代器位置之前插入元素。要步进迭代器,请使用std::nextstd::prev

#include <iostream>
#include <iterator>
#include <vector>

int main() {
    std::vector<int> vecta{10, 20, 30, 40, 50};
    std::vector<int> vectb{1000, 2000, 3000};

    // erase 30 from the vector
    vecta.erase(std::next(vecta.begin(), 2));

    // insert vectb before position 2
    vecta.insert(std::next(vecta.begin(), 2), vectb.begin(), vectb.end());

    for(int v : vecta) {
        std::cout << v << ' ';
    }
    std::cout << '\n';
}

输出:

10 20 1000 2000 3000 40 50

一种不需要使用erase的替代方法。这可能稍微更快一些:
#include <utility> // added for std::swap

int main() {
    std::vector<int> vecta{10, 20, 30, 40, 50};
    std::vector<int> vectb{1000, 2000, 3000};

    std::vector<int> result;

    // reserve space for the number of elements you know will be in the resulting vector
    result.reserve(vecta.size() - 1 + vectb.size());

    // append the 2 first elements from vecta
    result.insert(result.end(), vecta.begin(), std::next(vecta.begin(), 2));

    // append vectb
    result.insert(result.end(), vectb.begin(), vectb.end());

    // append the last two elements from vecta
    result.insert(result.end(), std::prev(vecta.end(), 2), vecta.end());

    // let vecta take over the data in result and vice-a-versa
    std::swap(result, vecta);
}

3
您可以使用 vector::insert实时示例
vecta.erase(vecta.begin() + 2); //<-- erase 30 element

vecta.insert(vecta.begin() + 2, vectb.begin(), vectb.end());

vecta.begin() + 2 是在 vecta 中插入 vectb 的位置,而 vectb.begin(),vectb.end() 则是需要插入的 vectb 元素的跨度。在这种情况下,需要插入所有元素。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接