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

时间:2020-02-09 15:14:03

标签: c++ stdvector

我想在向量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并将其替换为向量。

3 个答案:

答案 0 :(得分:6)

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

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

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

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


如何获得一个像{10,20,1000,2000,3000,40,50}这样的结果向量

为此,您还需要从30中删除元素vecta。您可以使用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()返回被删除元素之后的迭代器。由于您想从30中删除vecta,然后在该位置插入vectb,因此只需将迭代器erase()返回到insert()即可。

答案 1 :(得分: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);
}

答案 2 :(得分:3)

您可以使用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的元素范围,在这种情况下,所有这些。