将多个数字分配给增强矢量

时间:2014-01-25 14:10:02

标签: 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> values;  
    values += 1,2,3,4,5,6,7,8,9; // insert values at the end of the container
}

现在,当我尝试为增强矢量执行此操作时

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

它告诉我'没有操作符'+ =“匹配这些操作数。如何用boost矢量解决这个问题? (我认为它必须是简单的东西,但我太愚蠢了,不能看到它)

1 个答案:

答案 0 :(得分:0)

执行此操作的一种方法可能是使用流插入运算符。

#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;
}

结果是程序打印:

[9](1,2,3,4,5,6,7,8,9)

不幸的是,如果您没有适当调整矢量大小,它将会进行核心转储,因此这种方法存在潜在的缺点。我最初发布了一个答案,据说使用push_front( values ) = 1,2,3,4,5,6,7,8,9;然后我尝试了,并且惊讶地发现这个提升矢量没有push_frontpush_back运算符。

一个丑陋的替代方案是设置和使用增强矢量的基础数据表示,但这是相当hackish!

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

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