2013-03-18 69 views
8

我正在採取20行輸入。我想要將每行的內容分隔一個空格並將其放入向量的向量中。我如何製作矢量矢量?我有鬥爭,有把它推回去......如何推遲向量的矢量?

我的輸入文件:

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

的載體應該像這樣的事情。

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

這是我的代碼....

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

你有一個載體在那裏。你的代碼有什麼問題? – 2013-03-18 19:05:24

+1

@AndyProwl越界訪問(假設代碼是真實的代碼)。 – juanchopanza 2013-03-18 19:06:44

+0

@juanchopanza:哦,對:)好趕上 – 2013-03-18 19:09:09

回答

5

呦可以用大小ruleNum

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

的矢量這將持有ruleNumvector<string>元素開始。您可以將元素推回到每個元素中,就像您在發佈的示例中所做的那樣。

10

代碼是正確的,但你的向量中沒有元素,所以你不能訪問big[i]

設置循環前的矢量大小,無論是在構造函數或像這樣:

big.resize(ruleNum); 

或者,你可以在每個循環一步推空載體:

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

你不還需要圍繞big[i]的括號。

3

你可以做到以下幾點:

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

不需要在外部循環外面聲明'buf',實際上你忘記在循環內清除它,因爲那。 – 2013-03-18 19:28:00

+0

@KonradRudolph你說得對,我很粗心,代碼剛剛更新。謝謝! – taocp 2013-03-18 19:29:13

+0

哈哈,現在你做了不必要的工作,每次都重新定義向量,因此是空的,不需要「清除」它。 – 2013-03-18 19:31:34

1
   vector<vector<string> > v; 

到的push_back爲載體的載體,我們將在的push_back內部矢量串並的push_back內部矢量到外部載體。

顯示其實現的簡單代碼:enter code here vector> v; vector 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);