【问题标题】:Alternative to brace initialization in g++ 4.4g++ 4.4 中大括号初始化的替代方案
【发布时间】:2013-09-12 22:08:21
【问题描述】:

我想按如下方式初始化这个vector-of-vector-of-strings,使用g++ 4.4.7编译(由于运营政策,我不能使用更新的版本。

vector<vector<string>> phs2tm_vec {
    { "manager_n",  "manager_a",  "manager_e", "manager_p" },
    { "manager_na", "manager_ne", "manager_np" },
    { "manager_ccx" },
    { "manager_icx" }
};

g++ -std=gnu++0x编译,失败如下:

error: no matching function for call to 'std::vector<std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >, std::allocator<std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > >::vector(<brace-enclosed initializer list>)'
/usr/lib/gcc/x86_64-redhat-linux/4.4.7/../../../../include/c++/4.4.7/bits/stl_vector.h:271: note: candidates are: std::vector<_Tp, _Alloc>::vector(std::initializer_list<_Tp>, const _Alloc&) [with _Tp = std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >, _Alloc = std::allocator<std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >]

[additional candidates not listed ...]

This question 表明我的语法是正确的,但 g++ 4.4 不能正确或完全支持我正在尝试做的事情。

什么是完成这个向量的向量初始化的简单后备方法?

【问题讨论】:

  • boost::assignlist_of 怎么样?
  • 向量是容器,不是容器适配器。
  • “没有匹配的调用函数”不是链接器错误。这是一个简单的编译器错误。
  • 删除.to_adaptor() 编译;无法嵌套:vector&lt; vector&lt; string &gt;&gt; vvs = (list_of(list_of ( "a") ( "b") ( "C") ),list_of ( "d") ( "e"));(和其他人)
  • 是的,对不起。这是实际编译的代码:std::vector&lt;std::vector&lt;int&gt; &gt; vvi = list_of&lt;std::vector&lt;int&gt; &gt;(list_of(1)(2))(list_of(3)(4));

标签: c++ c++11 g++ list-initialization


【解决方案1】:

这是一个黑客,但这里是

vector<vector<string> > phs2tm_vec;

{
  const char *data[4][4] = {
    { "manager_n",  "manager_a",  "manager_e", "manager_p" },
    { "manager_na", "manager_ne", "manager_np" },
    { "manager_ccx" },
    { "manager_icx" }
  };

  for(size_t i=0; i<sizeof(data)/sizeof(data[0]); ++i) {
    vector<string> row;
    for(size_t j=0; j<sizeof(data[0])/sizeof(data[0][0]); ++j) {
      if(!data[i][j]) break;      // end of row
      row.push_back(data[i][j]);
    }
    phs2tm_vec.push_back(row);
  }
}

要查看它的实际效果,go here

【讨论】:

  • 第二、三、四行的未初始化值是否保证为NULL/0?
【解决方案2】:

感谢 @Dyp 提出这个 Boost 解决方案:

#include <boost/assign/list_of.hpp>
using boost::assign::list_of;

vector< vector< string >> phs2tm_vec =
    list_of< vector< string >>
    ( list_of ("manager_n")   ("manager_a")   ("manager_e")  ("manager_p") )
    ( list_of ("manager_na")  ("manager_ne")  ("manager_np") )
    ( list_of ("manager_ccx") )
    ( list_of ("manager_icx") );

【讨论】:

    猜你喜欢
    • 2017-10-09
    • 1970-01-01
    • 2019-08-04
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    • 2020-02-08
    • 2012-11-21
    • 1970-01-01
    相关资源
    最近更新 更多