2016-08-18 10 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文たい:すべてのヘルプ

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

が理解されるであろう。ありがとう!

+1

インデックスを使用する方が簡単かもしれません。リストの最初の文字列には前の文字列がないので、2番目の項目からループを開始したいことに注意してください。 – hyde

+0

Btw私が正しい方法で物事を見れば、リスト内の要素を変更していないので、indexを使って言及した@hyevは簡単な方法であり、 'at(...) 'を使うことに加えて、 'at(...)'は読み込み専用の 'const'を返します(基本的にはここでやっていることです)。イテレータは読み書きの両方を可能にします。アクセスを書き込むために 'readonly'となるだけのものを公開する必要はありません。 – rbaleksandar

+0

ループを反復処理することの利点は、手作業でそれを操作すると境界チェックの点で消えます。私はこれを言及しています。なぜなら 'at(...)'(これは私が最近発見した)は範囲外をチェックしないからです。 – rbaleksandar

答えて

2

あなたがやって前のイテレータを取得することができます。

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

それは前の要素を持っていないので、あなたは、最初の要素のための例外を作成する必要があります。 (「+ 1」に注意)(上記のような)範囲を確認するかforループ一つの要素は、最初の過ぎ起動次のいずれかの後者の場合には

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'が1要素下がりしないかどうかを調べるべきです。 'for'ループがリストの境界を越えないようにする一方で、内部のイテレータを変更することは余分なチェックが必要です。それ以外の場合は、it = it + 1000'とそれに続く10項目のリストのイテレータの値を取る何らかのアクションを実行し、アプリケーションがクラッシュしたり実際には見えないようなメモリ破損の問題を起こさないようにすることができます。頭痛の原因になります。 – rbaleksandar

+0

@SimonKraemer追加範囲チェック –

関連する問題