2013-03-03 4 views
1

Я в ситуации с объявлением vector<vector<string>>. В окнах это нормально, я могу объявить это в структуре, например, vector<vector<string>>v={{"me","you"}}, но на машине linux ... только ошибки, поэтому я должен объявить ее после инициализации структуры, но так как mystruct.vec[0]={"me","you"} дает мне ошибку сегментации. Любые предложения, пожалуйста?Векторы векторов строка номер

+0

Возможно, разные версии компиляторов или компиляторы на окнах и Linux. Укажите, какие компиляторы вы используете или (для решения) просто обновите Linux-модуль до последнего компилятора. –

+1

Эта инициализация относительно новая - это C++ 11. Не все компиляторы предлагают полную поддержку стандарта. – dasblinkenlight

+0

Ну, на окнах я использую кодовые блоки с mingw и последними gcc на linux. – siloan

ответ

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++ --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

+0

@siloan - Похоже, что списки инициализаторов были введены в 4.4. Вы уверены, что компилируете флаги '-std = gnu ++ 0x' или' -std = C++ 0x'? – Omnifarious

+0

Да, я компилирую с этим флагом и для этого 'std :: vector > v = {{"me", "you"}}; дает мне ошибку ошибок. – siloan

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"}}; 
} 
Смежные вопросы