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

Inserting a vector in a certain position in another vector

本文关键字:向量 位置 另一个 插入 一个      更新时间:2023-10-16

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

我想在

矢量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()即可。

您可以使用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

现场样品

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

vecta.begin() + 2vecta中插入vectb的点,并vectb.begin(), vectb.end()您需要插入的vectb元素的跨度,在这种情况下,所有这些元素。