如何将一个向量插入到特定位置的另一个向量中,以便我将获得两个向量的大向量并且该位置将被覆盖?
How to insert a vector into another vector in a specific place so that i will get a big vector of both and that place will be overwritten?
作为练习,我真的需要知道如何将一个向量插入到另一个向量中。
这是我需要的示例:
//let's say i have these 2 vecs:
vec1 = { 18, 192, 34};
vec2 = { 171, 11, 50, 6};
然后我选择连接它们的点,假设我选择 vec 1
像这样放置向量 2 的 2:
result_vec = { 171, vec1, 50, 6};
所以我完成后实际得到的是:
result_vec = { 171, 18, 192, 34, 50, 6};
对我来说,看到两个例子会更好,一个简单的例子和另一个带有 shared_ptr 或 unique_ptr 等智能指针的例子。
谢谢!
有时浏览一些参考资料并查看容器提供的方法会有所帮助。大多数时候,您会发现有一种方法可以开箱即用。在这种情况下是 std::vector::insert
(overload (4)). To remove the old element at that place you can use std::vector::erase
:
#include <iostream>
#include <vector>
int main() {
std::vector<int> vec1{ 18, 192, 34};
std::vector<int> vec2{ 171, 11, 50, 6};
vec1.insert(vec1.begin()+1,vec2.begin(),vec2.end());
vec1.erase(vec1.begin()+1);
for (int e : vec1) std::cout << e << ' ';
}
输出:
18 11 50 6 192 34
我是反着插的,应该很容易调整。同样对智能指针做同样的事情不需要使用不同的 algorithm/method 。如果你想保留原始向量,你只需要在插入之前制作一个副本。
PS:我先是看错了题,漏掉了你插入的地方去掉元素的部分。我的固定解决方案不是最有效的,因为插入和擦除旧元素可以一次性完成。然而,对于不太大的向量,效率上的差异可能可以忽略不计。
您似乎想用一个向量的一个元素替换另一个向量的元素。如果是这样,那么您可以编写一个类似于演示程序中所示的函数。
#include <iostream>
#include <vector>
#include <iterator>
template <typename T>
std::vector<T> & replace( std::vector<T> &v1,
typename std::vector<T>::size_type pos,
const std::vector<T> &v2 )
{
if ( not ( pos < v1.size() ) )
{
v1.insert( std::end( v1 ), std::begin( v2 ), std::end( v2 ) );
}
else
{
v1.insert( v1.erase( std::next( v1.begin(), pos ) ),
std::begin( v2 ), std::end( v2 ) );
}
return v1;
}
int main()
{
std::vector<int> v1 = { 171, 11, 50, 6 };
std::vector<int> v2 = { 18, 192, 34 };
for ( const auto &item : replace( v1, 1, v2 ) ) std::cout << item << ' ';
std::cout << '\n';
return 0;
}
程序输出为
171 18 192 34 50 6
作为练习,我真的需要知道如何将一个向量插入到另一个向量中。
这是我需要的示例:
//let's say i have these 2 vecs:
vec1 = { 18, 192, 34};
vec2 = { 171, 11, 50, 6};
然后我选择连接它们的点,假设我选择 vec 1 像这样放置向量 2 的 2:
result_vec = { 171, vec1, 50, 6};
所以我完成后实际得到的是:
result_vec = { 171, 18, 192, 34, 50, 6};
对我来说,看到两个例子会更好,一个简单的例子和另一个带有 shared_ptr 或 unique_ptr 等智能指针的例子。
谢谢!
有时浏览一些参考资料并查看容器提供的方法会有所帮助。大多数时候,您会发现有一种方法可以开箱即用。在这种情况下是 std::vector::insert
(overload (4)). To remove the old element at that place you can use std::vector::erase
:
#include <iostream>
#include <vector>
int main() {
std::vector<int> vec1{ 18, 192, 34};
std::vector<int> vec2{ 171, 11, 50, 6};
vec1.insert(vec1.begin()+1,vec2.begin(),vec2.end());
vec1.erase(vec1.begin()+1);
for (int e : vec1) std::cout << e << ' ';
}
输出:
18 11 50 6 192 34
我是反着插的,应该很容易调整。同样对智能指针做同样的事情不需要使用不同的 algorithm/method 。如果你想保留原始向量,你只需要在插入之前制作一个副本。
PS:我先是看错了题,漏掉了你插入的地方去掉元素的部分。我的固定解决方案不是最有效的,因为插入和擦除旧元素可以一次性完成。然而,对于不太大的向量,效率上的差异可能可以忽略不计。
您似乎想用一个向量的一个元素替换另一个向量的元素。如果是这样,那么您可以编写一个类似于演示程序中所示的函数。
#include <iostream>
#include <vector>
#include <iterator>
template <typename T>
std::vector<T> & replace( std::vector<T> &v1,
typename std::vector<T>::size_type pos,
const std::vector<T> &v2 )
{
if ( not ( pos < v1.size() ) )
{
v1.insert( std::end( v1 ), std::begin( v2 ), std::end( v2 ) );
}
else
{
v1.insert( v1.erase( std::next( v1.begin(), pos ) ),
std::begin( v2 ), std::end( v2 ) );
}
return v1;
}
int main()
{
std::vector<int> v1 = { 171, 11, 50, 6 };
std::vector<int> v2 = { 18, 192, 34 };
for ( const auto &item : replace( v1, 1, v2 ) ) std::cout << item << ' ';
std::cout << '\n';
return 0;
}
程序输出为
171 18 192 34 50 6