C++ 给一个助力矢量分配几个数字

C++ 给一个助力矢量分配几个数字,c++,boost,vector,C++,Boost,Vector,假设我想给向量v分配一个包含3个数字的列表,使得v[0]是列表的第一个元素,v[1]是第二个元素,v[2]是第三个元素。 我发现对于标准向量模板,有一个boost的赋值库 #include <boost/assign/std/vector.hpp> // for 'operator+=()' using namespace boost::assign; // bring 'operator+=()' into scope int main { vector<int&g

假设我想给向量v分配一个包含3个数字的列表,使得v[0]是列表的第一个元素,v[1]是第二个元素,v[2]是第三个元素。 我发现对于标准向量模板,有一个boost的赋值库

#include <boost/assign/std/vector.hpp> // for 'operator+=()'
using namespace boost::assign; // bring 'operator+=()' into scope

int main {
    vector<int> values;  
    values += 1,2,3,4,5,6,7,8,9; // insert values at the end of the container
}
#包括//for'operator+=()'
使用名称空间boost::assign;//将“运算符+=()”引入范围
int main{
向量值;
values+=1,2,3,4,5,6,7,8,9;//在容器末尾插入值
}
现在,当我试着对一个推进向量这样做的时候

boost::numeric::ublas::vector<int> values
values += 1,2,3,4,5,6,7,8,9;
boost::numeric::ublas::向量值
数值+=1,2,3,4,5,6,7,8,9;

它告诉我没有运算符“+=”与这些操作数匹配。如何用boost向量解决这个问题?(我想它一定很简单,但我太傻了,看不到它)

一种方法是使用流插入操作符

#include <boost/assign.hpp>
#include <boost/assign/std/vector.hpp> // for 'operator+=()'
#include <boost/assert.hpp> 
#include <boost/numeric/ublas/vector.hpp>
#include <boost/numeric/ublas/assignment.hpp>
#include <boost/numeric/ublas/io.hpp>

using namespace std;
using namespace boost::assign; // bring 'operator+=()' into scope

int main()
{
    boost::numeric::ublas::vector<int> values(9);
    values <<= 1,2,3,4,5,6,7,8,9;
    BOOST_ASSERT( values.size() == 9 );
    BOOST_ASSERT( values[0] == 1 );
    BOOST_ASSERT( values[8] == 9 );
    std::cout << values << std::endl;
}
不幸的是,如果您还没有适当地调整向量的大小,它将导致内核转储,因此这是该方法的一个潜在缺点。我最初发布的答案是使用
push_front(values)=1,2,3,4,5,6,7,8,9
但后来我尝试了一下,惊讶地发现这个推进向量既没有
前推
操作符,也没有
后推
操作符

一个丑陋的替代方案是设置和使用boost向量的底层数据表示,但这相当粗糙

    boost::numeric::ublas::vector<int, std::vector<int>> values;
    push_back(values.data()) = 1,2,3,4,5,6,7,8,9;
boost::numeric::ublas::向量值;
向后推(values.data())=1,2,3,4,5,6,7,8,9;

这将基础数据表示形式设置为
std::vector
,然后使用Boost
assign
库使第二行中的语法成为可能。

这是一种可怕的语法。在我看来这不是一个好主意。你真的读过吗?“我想它一定很简单,但我太傻了,看不到它”-你必须编写一个重载的
操作符+=()
,它接受适当的参数并返回适合链接的适当类型。由于您需要对
boost
有所了解才能实现上述目标,因此我认为这可能不像您想象的那么简单。另外,正如Karoly已经说过的,这是一种可怕的语法——必须有一种更直观的方法来做到这一点。
    boost::numeric::ublas::vector<int, std::vector<int>> values;
    push_back(values.data()) = 1,2,3,4,5,6,7,8,9;