2017-03-16 181 views
0

所以我做了一個vector<string>我從文本文件中讀取的行。事情是這些行組成了一小組數據。我想要做的就是迭代這些數據塊。 (可以是每行3或4行,通過查看第2行的內容可以看出)。迭代遍歷矢量時跳過行

一些樣品的數據可以是這樣的:

鏈接

蘋果

鏈接

蘋果

香蕉

目前我所試圖做的是:

for(vector<string>::size_type i = 0; i != records.size(); i++){ 
    cout << "Test << endl; 
    string a = records[i]; 
    string b = records[i+1]; 
    string c = records[i+2]; 
    i += 3; 
} 

基本上我試圖讓從名字i跳到名稱,而不管它是3或4行塊。

但是,由於可能很明顯的原因,這是行不通的。問題是:

我如何遍歷一個向量,所以我可以跳線,但它不會迭代/嘗試遍歷每一行,並導致錯誤?

因爲現在當我嘗試這樣做(僅使用2,3行記錄的測試用例),它不起作用。我只應該使用這個循環來閱讀兩次,但我不知何故以更多的方式閱讀。那麼我該如何解決它?

+1

如果'i + 1'或'i + 2'大於'records.size()',會發生什麼? – lcs

+0

爲什麼你在循環中增加三個* i?這意味着每次迭代它將增加*四*。爲什麼不只是做例如實際循環語句中的「i + = 3」? –

+0

對於初學者來說,如果你的文本文件不完全是4行的倍數,你將會遇到緩衝區溢出問題。 – Xirema

回答

2

對於初學者,您需要確保您的循環不會超出範圍。這只是通過改變條件來完成的,以確保索引是而不是矢量的大小

然後,您需要通過將第二行轉換爲您用於獲取其餘數據的數字,實際獲得向量中有效「行數」的數量。

考慮到你輸入我會做這樣的事情:

for(vector<string>::size_type i = 0; i < records.size(); /* note no increment */){ 
    string name = records[i]; 
    unsigned long count = stoul(records[i + 1]); 

    for (unsigned long j = 0; j < count && i + j < records.size(); ++j){ 
     // Read and do something with records[i + j] 
    } 

    i += 2 + count; 
} 

請注意,你應該檢查的records的大小至少2進入外循環之前。

+0

非常感謝你幫助我解決這個問題。出於某種原因,我沒有想到我可能沒有增量。 +1並被接受。 – Annabelle

+0

你也可以把count放在for的第一個語句中,並在循環定義中做增量,例如'for(vector :: size_type i = 0,count = 0; i + 1 Caleth

0

基於@ Someprogrammerdude的答案的基於迭代器的替代方法。

typedef vector<string>::const_iterator iterator; 
for (iterator it = records.begin(); records.end() - it > 1; /* note no increment */) 
{ 
    string name = *it++; 
    unsigned long count = stoul(*it++); 

    for (; count && it != records.end(); --count, ++it){ 
     // Read and do something with *it 
    } 
}