2013-03-03 77 views
1

我处于声明vector<vector<string>>的情况。在Windows上,我可以声明这样的结构像vector<vector<string>>v={{"me","you"}},但在Linux机器..只是错误,所以我必须在结构初始化后声明它,但如何,因为mystruct.vec[0]={"me","you"}给我一个分段错误。任何请求?向量字符串向量的问题

+0

在windows和linux上可能有不同的编译器版本或编译器。请指定您正在使用的编译器,或者(对于解决方案),只需将linux盒升级到最新的编译器即可。 – 2013-03-03 23:14:29

+1

这种初始化相对较新 - 它是C++ 11。并非所有编译器都提供对该标准的全面支持。 – dasblinkenlight 2013-03-03 23:14:57

+0

在Windows上,我在linux上使用mingw和最新的gcc代码块。 – siloan 2013-03-03 23:20:50

回答

2

在GCC 4.7.2这个程序只是正常:

#include <vector> 
#include <string> 
#include <utility> 
#include <iostream> 

using ::std::vector; 
using ::std::string; 
using ::std::move; 

vector<vector<string>> foo() 
{ 
    vector<vector<string>>v={{"me","you"}}; 
    return move(v); 
} 

int main() 
{ 
    using ::std::cout; 

    cout << "{\n"; 
    for (auto &i: foo()) { 
     cout << " {\n"; 
     for (auto &o: i) { 
     cout << "  \"" << o << "\",\n"; 
     } 
     cout << " },\n"; 
    } 
    cout << "}\n"; 
    return 0; 
} 

它产生这样的输出:

$ /tmp/a.out 
{ 
    { 
     "me", 
     "you", 
    }, 
} 

我想你问题是旧的编译器或者在代码中的其他位置有其他问题。

我用这个命令行编译:

$ g++ -std=gnu++0x -march=native -mtune=native -Ofast -Wall -Wextra vvstr.cpp 

我的G ++给出了这样一个版本:

$ g++ --version 
g++ (GCC) 4.7.2 20121109 (Red Hat 4.7.2-8) 
Copyright (C) 2012 Free Software Foundation, Inc. 
This is free software; see the source for copying conditions. There is NO 
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 

本页面告诉你哪个GCC的版本有哪些C++功能:

+0

似乎是我的4.4.5(debian).. – siloan 2013-03-03 23:34:34

+0

@siloan - 它看起来像在4.4中引入了初始化器列表。你确定你正在用'-std = gnu ++ 0x'或'-std = C++ 0x'标记编译吗? – Omnifarious 2013-03-03 23:38:38

+0

是的,我正在编译该标志,并为此'std :: vector > v = {{“我”,“你”}};'给了我一堆错误。 – siloan 2013-03-03 23:46:11

2

如果您使用的是GCC,则需要支持此C++ 11初始化功能的版本,然后您需要告诉编译器在C++ 11模式下编译为-std=c++0x标志(或=std=c++11为4.7系列)。见this demo,与GCC 4.7.2编译:

#include <vector> 
#include <string> 
int main() 
{ 
    std::vector<std::vector<std::string>> v = {{"me","you"}}; 
}