C++ 向向量添加多个值

C++ 向向量添加多个值,c++,vector,addition,C++,Vector,Addition,我有一个整数向量,我也想添加多个值,但是太多的值需要使用大量的推回来添加。是否有在向量末尾添加多个值的方法。大致如下: std::vector<int> values values += {3, 9, 2, 5, 8, etc}; std::向量值 值+={3、9、2、5、8等}; 我发现boost有类似的东西,但我不想包含boost #include <boost/assign/std/vector.hpp> using namespace boost::assi

我有一个整数向量,我也想添加多个值,但是太多的值需要使用大量的
推回来添加。是否有在向量末尾添加多个值的方法。大致如下:

std::vector<int> values
values += {3, 9, 2, 5, 8, etc};
std::向量值
值+={3、9、2、5、8等};
我发现boost有类似的东西,但我不想包含boost

#include <boost/assign/std/vector.hpp>

using namespace boost::assign;

{
    std::vector<int> myElements;
    myElements += 1,2,3,4,5;
}
#包括
使用名称空间boost::assign;
{
std::载体髓鞘成分;
髓质+=1,2,3,4,5;
}
似乎是这样宣布的:

template <class V, class A, class V2>
inline list_inserter<assign_detail::call_push_back<std::vector<V,A> >, V> 
operator+=( std::vector<V, A>& c, V2 v )
{
    return push_back( c )( v );
}
模板
内联列表插入器
运算符+=(标准::向量和c,V2 v)
{
返回推回(c)(v);
}
是否有任何C++/C++11方法可以做到这一点,或者,如果没有,将如何实现它?

可能需要:

.

这应该可以:

std::vector<int> values;
values.insert( values.end(), { 1, 2, 3, 4 } );
std::向量值;
插入(values.end(),{1,2,3,4});

您只需创建一个操作符:

模板
std::vector和operator+=(std::vector和lhs,std::initializer\u list l)
{
左侧插入物(标准端部(左侧),l);
返回lhs;
}

您可以模拟boost
boost::assign
行为

template <typename T> 
class vector_adder 
{
public:
    std::vector<T>& v;
    vector_adder(std::vector<T>& v):v(v)
    {  }

    vector_adder& operator,(const T& val)
    {  
       v.push_back(val);
       return *this;
    }
};

template <typename T> 
vector_adder<T> operator+=(std::vector<T>& v,const T& x)
{
    return vector_adder<T>(v),x;
}
模板
类向量加法器
{
公众:
std::vector&v;
向量加法器(std::vector&v):v(v)
{  }
向量加法器和运算符(常数T和值)
{  
v、 推回(val);
归还*这个;
}
};
模板
向量加法器运算符+=(标准::向量和向量,常数T和x)
{
返回向量_加法器(v),x;
}
那么

std::向量v{1,2,3,4};
v+=11,12,13,14;

请参见

为了提供尽可能多的解决方案,这也应该有效:

for(const auto x : {11, 12, 13, 14})
    v.push_back(x);

.

您可以通过使用插入成员函数来执行此操作,例如:

vector<int> v; 
int myarr[] {1, 2, 4, 5, 5, 6, 6, 8}; //brace initialization with c++11

v.insert(v.end(), myarr, myarr+8);
向量v; int myarr[]{1,2,4,5,5,6,6,8}//用c++11实现大括号初始化 v、 插入(v.end(),myarr,myarr+8);
以前有一个答案忽略了insert参数中的中间参数,但这个答案不起作用。insert方法有几种格式,可以找到,我编写的代码片段实际上遵循以下格式:

插入(开始输入值的位置、输入的第一个值、输入的值数)

注意:最后两个参数(即myarr、myarr+8)使用指针算法。myarr是数组中第一个元素在内存中的地址,第二个值是第八个元素的地址。您可以阅读有关指针算术的内容


希望有帮助

这有一个恼人的问题,我从来没有真正找到一个好的解决办法;如果将此函数放在全局命名空间中,然后尝试在定义了完全不同的
运算符+=
的命名空间中使用它,则此函数将隐藏。要解决这个问题,您必须在声明另一个
操作符+=
的任何命名空间中使用::operator+=。ADL找不到这个,因为它只会检查
名称空间std
(我们不能把它放在
名称空间std
中,因为用户代码不能这样做)。@MattMcNabb我知道这一点。我应该对此添加一条评论。@0x499602D2:还不算太晚!好。。。您可以使用刚刚读取并重新生成的boost代码。有些相关的是,如果您知道要将大小增加N>1,则应在添加值之前调用
v.reserve
适当增加保留大小。或使用
v.insert
,如上所述。
for(const auto x : {11, 12, 13, 14})
    v.push_back(x);
vector<int> v; 
int myarr[] {1, 2, 4, 5, 5, 6, 6, 8}; //brace initialization with c++11

v.insert(v.end(), myarr, myarr+8);