将一个向量插入另一个向量中的某个位置

Inserting a vector in a certain position in another vector

我想在向量a的某个位置插入向量b。例如

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

我怎样才能得到像 {10,20,1000,2000,3000,40,50} 这样的结果向量? 我想删除 30 并将其替换为向量。

I want to insert vector b in a certain position in a vector a

您可能需要考虑 std::vector::insert():

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

其中pos上面是指向元素的迭代器(在vecta之前将插入vectb的内容。 pos 也可能是 end() 返回的迭代器,这意味着 附加 vectb 的内容到 vecta.


How can I have a result vector to be like {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() returns 被移除元素之后的迭代器。由于您想从 vecta 中删除 30,然后在该位置插入 vectb,您可以简单地将迭代器 erase() returns 传递给 insert() .

可以用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);
}

您可以使用vector::insert

Live sample

vecta.erase(vecta.begin() + 2); //<-- erase 30 element
vecta.insert(vecta.begin() + 2, vectb.begin(), vectb.end());

vecta.begin() + 2vectbvecta的插入点和vectb.begin(), vectb.end()需要插入的vectb元素的跨度,在这种情况下,全部。