Я хочу инициализировать этот вектор-вектор-строки следующим образом, компилируя с 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 ...]
Этот вопрос предполагает, что мой синтаксис правильный, но g ++ 4.4 не правильно или не полностью поддерживает то, что я пытаюсь сделать.
Каким будет простой резервный метод для выполнения этой инициализации вектора-вектора?
Это взломать, но здесь идет
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);
}
}
Чтобы увидеть это в действии, иди сюда.
Спасибо @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") );