1

次のコード スニペットを検討してください。

map<wstring,int>::iterator it;
map<wstring,int> bimap;

//Creating Bigrams out of monograms
for (it= container.begin(); it != container.end();)
{
    bimap[it->first + L" "+((++it)->first)]++;
    ++it;
    ++it;
}

このコードを実行すると、プログラムがクラッシュし、そのクラッシュの理由は iterator の 2 番目のインクリメントですit。なぜこのようになっているのですか?イテレータはインクリメントする必要があり、1 回ではなく 2 回インクリメントしています。どうしたの?

上記の for ステートメントで実際に行っているように、隣接する 2 つのマップ項目の値を他のマップに保存したい場合は、どうすればよいですか? 他の3つのアイテムごとにまとめて保管したい場合はどうすればよいですか?

それぞれ続行するにはイテレータを更新する必要がありますが、その方法がわかりません。

4

3 に答える 3

1

イテレータを数回インクリメントしています

for (it= container.begin(); it != container.end();)
{
    bimap[it->first + L" "+((++it)->first)]++;  //increment!
    ++it;  //increment!
    ++it;  //increment!
}

it != container.end()そのため、最後の要素にいると、条件が満たされたためにループに入り、範囲外になります。

常に 2 つのインクリメントを行い、要素が 1 つしか残っていない場合は終了することがわかっている場合は、次のように考えることができます。

for (it= container.begin(); it != container.end();)
{
    //do something
    ++it;  //increment!

    if(it!=container.end()){  //check again. can we move forward?
    //do something
    ++it;  //increment!
    }
}
于 2013-07-21T12:40:56.643 に答える
1

反復ごとに1回インクリメントし、3を法とする補助カウンターを使用して(3回の反復ごとにリセットする)、0になるたびにやりたいタスクを実行します。次のようなものです。

int counter_mod3;
for (it= container.begin(); it != container.end();)
{
  if(counter_mod3 == 0) // This zero chooses the phase on which the "sampling" is to be made
    bimap[it->first + L" "+(it->first)]++;  //increment!

  ++it;  //increment!
  counter_mod3 = (counter_mod3++) % 3;
}

最初の要素ではなく、他の要素から開始する場合は、フェーズを 1 または 2 に変更します。

于 2013-07-21T14:51:18.660 に答える