1. ホーム
  2. c++

[解決済み] forループでベクターイテレータが再参照できない

2022-02-27 12:52:11

質問

ある単語が何回入力されたかをカウントし、その単語と何回入力されたかを表示するループを使っています。最後の単語が印刷される前に、イテレータが再参照できないというエラーが発生します。以下は、私のループのコードです。

for (vector<string>::iterator it = v.begin() ; it != v.end(); ++it)
    {
        if (*it == *(it+1))
        {
        count++;
        }
        else if (*it != *(it+1))
        {
                count++;
            cout << *it << " ---- " << count << endl;
            count=0;
        }
    }

解決方法は?

あなたのコードには未定義の動作がある - 想像してみてください it の最後の要素を指しています。 v であれば、あなたは参照外しを行おうとしている v.end()*(it+1)

if (*it != *(it+1)

STLイテレータ、endは最後の要素を指しません。end()は、コンテナ内の要素の終わりを表すイテレータを返します。end は位置 後ろの 最後の要素です。このようなイテレータは 終了後イテレータ .

このように、begin()とend()で定義された 半開きの の範囲は、最初の要素を含むが を除く 最後の

 --------------------------------
 |  |   |   |   |   |   |   |   |
 --------------------------------
  /\                               /\      
begin()                            end() 

あなたが実現しようとしていることについては、次のものを見てください。 std::adjacent_find

auto it = std::adjacent_find(v.begin(), v.end());

if (it != v.end())
{
  count ++;
}
else
{
   cout << *it << " ---- " << count << endl;
}