C++ 给一个助力矢量分配几个数字
假设我想给向量v分配一个包含3个数字的列表,使得v[0]是列表的第一个元素,v[1]是第二个元素,v[2]是第三个元素。 我发现对于标准向量模板,有一个boost的赋值库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
#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
,然后使用Boostassign
库使第二行中的语法成为可能。这是一种可怕的语法。在我看来这不是一个好主意。你真的读过吗?“我想它一定很简单,但我太傻了,看不到它”-你必须编写一个重载的操作符+=()
,它接受适当的参数并返回适合链接的适当类型。由于您需要对boost
有所了解才能实现上述目标,因此我认为这可能不像您想象的那么简单。另外,正如Karoly已经说过的,这是一种可怕的语法——必须有一种更直观的方法来做到这一点。
boost::numeric::ublas::vector<int, std::vector<int>> values;
push_back(values.data()) = 1,2,3,4,5,6,7,8,9;