将一个向量插入另一个向量中的某个位置
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::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);
}
您可以使用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
元素的跨度,在这种情况下,全部。
我想在向量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 vectora
您可能需要考虑 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::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);
}
您可以使用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
元素的跨度,在这种情况下,全部。