我想在向量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
并将其替换为向量。
答案 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::next
和std::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
vecta.erase(vecta.begin() + 2); //<-- erase 30 element
vecta.insert(vecta.begin() + 2, vectb.begin(), vectb.end());
vecta.begin() + 2
是vectb
中vecta
的插入点,并且vectb.begin(), vectb.end()
需要插入vectb
的元素范围,在这种情况下,所有这些。