2013-03-18 18 views
8

Biorę 20 linii wejściowych. Chcę oddzielić zawartość każdej linii przez spację i umieścić ją w wektorze wektorów. Jak zrobić wektor wektorów? Mam mieć zmagania popychając go z powrotem ...jak odepchnąć wektor wektorów?

mój plik wejściowy:

Mary had a little lamb 
lalala up the hill 
the sun is up 

Wektor powinien wyglądać mniej więcej tak.

ROW 0: {"Mary","had", "a","little","lamb"} 
ROW 1: {"lalala","up","the","hill"} 

To jest mój kod ....

string line; 
vector <vector<string> > big; 
string buf; 
for (int i = 0; i < 20; i++){ 
    getline(cin, line); 
    stringstream ss(line); 

    while (ss >> buf){ 
     (big[i]).push_back(buf); 
    } 
} 
+0

Masz wektor wektorów tam. Co jest nie tak z twoim kodem? –

+1

@AndyProwl poza dostępem do granic (zakładając, że kod jest dobrą reprezentacją rzeczywistego). – juanchopanza

+0

@juanchopanza: Oh, racja :) Dobry połów –

Odpowiedz

5

Yo można uruchomić z wektorem wielkości ruleNum

vector <vector<string> > big(ruleNum); 

To trzymać ruleNum pustych vector<string> elementy. Następnie możesz przywrócić elementy do każdego z nich, tak jak robisz to w zamieszczonym przykładzie.

10

Kod jest prawidłowy, ale twój wektor ma zero elementów, więc nie możesz uzyskać dostępu do big[i].

ustawić rozmiar wektora przed pętli, albo w konstruktorze lub tak:

big.resize(ruleNum); 

Alternatywnie można naciskać pusty wektor w każdym kroku pętli:

big.push_back(vector<string>()); 

nie robić Potrzebuję również nawiasów wokół big[i].

3

można wykonać następujące czynności:

string line; 
vector <vector<string> > big; //BTW:In C++11, you can skip the space between > and > 

string currStr; 
for (int i = 0; i < ruleNum; i++){ 
    getline(cin, line); 
    stringstream ss(line); 
    vector<string> buf; 
    while (ss >> currStr){ 
     buf.push_back(buf); 
    } 
    big.push_back(buf); 
} 
+0

Nie trzeba deklarować 'buf' poza zewnętrzną pętlą, a właściwie zapomniałeś wyczyścić ją wewnątrz pętli z powodu że. –

+0

@KonradRudolph Masz rację, byłem nieostrożny, kod właśnie zaktualizowany. Dzięki! – taocp

+0

Haha, teraz robisz niepotrzebną pracę, wektor jest przedefiniowany za każdym razem i dlatego pusty, nie ma potrzeby "wyczyszczenia()" go. –

1
   vector<vector<string> > v; 

do push_back do wektorów wektorów, będziemy push_back sznurki w wewnętrznym wektora i push_back wewnętrzną wektor do wektora zewnętrznego.

Prosty kod pokazujący jego implementację: enter code here wektor> v; wektor s;

s.push_back("Stack"); 
s.push_back("oveflow");` 
s.push_back("c++"); 
// now push_back the entire vector "s" into "v" 
v.push_back(s);