2016-08-18 616 views
0

我目前正在研究一個小程序,其中我將計算文本中提及某個單詞的次數。但是我只想在上一個元素是一個10位數的時候計算這個單詞。 所以我想要做的是我會檢查迭代器的前一個元素是否包含一個10位數字。但我不知道如何迭代迭代器中的前一個元素。獲取QStringList的前一個元素

QString input = ui->listinput->toPlainText(); 

QStringList inputlist = input.split(QRegExp("[\s\n\r " "]+")); 

unsigned int boxCount(0); 

for(QStringList::iterator it(inputlist.begin()); it != inputlist.end(); ++it){ 

    if(!QString::compare(*it,box)) ++boxCount; 

} 

所以我想,如果語句是這樣的:

if(!QString::compare(*it,box) && *prev_it == 10 digits) ++boxCount; 

任何幫助將不勝感激。謝謝!

+1

使用索引可能會更簡單。請注意,列表中的第一個字符串沒有以前的字符串,所以您希望從第二個項目開始循環。 – hyde

+0

順便說一句,如果我看到事情正確的方式,你不改變列表中的元素,所以@hyde提到使用索引是一種簡單的方法,除了使用'at(...)'將是正確的路要走因爲'at(...)'返回一個只能被讀取的'const'(基本上這就是你在這裏做的)。迭代器允許讀寫。無需暴露足夠的「只讀」來寫入訪問權限。 – rbaleksandar

+0

如果您手動修補它,通過循環迭代的優點在邊界檢查方面會消失。我提到這一點是因爲'at(...)'(我最近才發現)不檢查是否出界。 – rbaleksandar

回答

2

您可以通過執行獲得先前的迭代器:

if (it != inputlist.begin()) { 
    prev_it = it - 1 
} 

你將不得不破例爲第一要素,因爲它沒有一個元素。無論是檢查範圍(如上述)或過去的第一啓動for一種元素(注意「+ 1」):

for (QStringList::iterator it(inputlist.begin() + 1); it != inputlist.end(); ++it) { 
    ... 
} 

在後一種情況下,你必須在你的列表中包含至少一個可以肯定的元件。

然後,如果您要檢查,如果數字是10位(假設十進制和整數),您可以嘗試以下方法:

bool ok = false; 
long num = prev_it->toLong(&ok); 
if (ok && num >= 1000000000) { 
    // do something 
} 

注:我用long類型,因爲我不知道的範圍內的數字,但他們似乎很大。

+0

不要忘記先檢查範圍。 –

+0

你應該檢查'it-1'是否不會降低一個元素。雖然'for'循環確保你不會超出列表的範圍,改變裏面的迭代器需要額外的檢查。否則,我們可以執行'it = it + 1000',然後執行一些操作,將迭代器的值作爲10個項目的列表,並希望應用程序不會崩潰或創建某種可能實際上保持不可見的內存損壞問題引起很多頭痛。 – rbaleksandar

+0

@SimonKraemer新增範圍檢查 –