初始化std :: vector <std :: vector <double>&gt;在VS2012

时间:2016-07-27 16:56:13

标签: c++ c++11 visual-studio-2012 vector initializer-list

我有这个代码,完全在gcc(c ++ 11)上编译:

static const std::vector< std::vector<double> > vect = 
{
  {1,1,1}, 
  {1,1,-1}, 
  {-1,1,-1}, 
  {-1,1,1}, 
  {1,-1,1}, 
  {1,-1,-1}, 
  {-1,-1,-1}, 
  {-1,-1,1}
};

但是,当我尝试在VS2012上编译时,我首先得到了一个不支持的初始化列表错误。我通过安装November CTP并使用新的编译器来修复它。 但是,现在我收到了这个错误:

error C2440: 'initializing' : cannot convert from 'initializer-list' to 'std::vector<std::vector<double,std::allocator<_Ty>>,std::allocator<std::vector<_Ty,std::allocator<_Ty>>>>'
1>          with
1>          [
1>              _Ty=double
1>          ]
1>          No constructor could take the source type, or constructor overload resolution was ambiguous

我见过有人说要使用数组并使用范围构造函数,但这通常用于单维向量。

我可能也会这样做,但这意味着我需要首先逐个初始化所有向量,然后通过推送向量初始化向量的第二维,如下所示:

std::array<double,3> v0_init = {1,1,1};
std::vector<double> v0(v0_init.begin(), v0_init.end());
std::array<double,3> v1_init = {1,1,-1};
std::vector<double> v1(v1_init.begin(), v1_init.end());
...
std::vector< std::vector<double> > vect;
vect.push_back(v0);
vect.push_back(v1);
...

但我不认为这是一种干净的方式,并且找到矢量值也不容易(其他人可能必须访问,修改甚至添加矢量,我不希望它们有复制/粘贴一些代码以向列表中添加一些新的向量。)

有更好的方法吗?

谢谢。

0 个答案:

没有答案