假设我想为向量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矢量解决这个问题? (我认为它必须是简单的东西,但我太愚蠢了,不能看到它)
答案 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_front
或push_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
库使第二行中的语法成为可能。