0
list< int > a;

list < int > ::iterator it;

it = a.begin();

it=a.insert(it,10);
it=a.insert(it,210);
it=a.insert(it,310);
it=a.insert(it,410);
it=a.insert(it,510);


it = find(a.begin(),a.end(),180);

cout << *it << endl;

このプログラムでは、値 180 はこのリストにありません。そのため、find STL アルゴリズムに従って、最後の値を返す必要がありますが、この値を出力すると、ゴミが発生します。イテレータが別の場所を指しているようです。エラーを見つけるのを手伝ってください。

4

2 に答える 2

2

a.end()最後の値への反復子ではなく、リストの最後の要素を過ぎた反復子です。印刷したり、アクセスしたりしないでください。の場合std::find、戻り値を終了イテレータと比較する必要があります。一致する場合、要求された値に一致する要素がそのコンテナにありません。

it = find(a.begin(),a.end(),180);
if( a.end() == it ) { // using Yoda conditional
    cout << "no element matching value.." << endl;
} else {
    cout << *it << endl;
}
于 2013-10-07T02:16:00.747 に答える
1

std::findend()要素が STL コンテナーで見つからない場合に戻ります。逆参照end()は未定義の動作です。

it逆参照する前にイテレータをテストする必要があります。

it = find(a.begin(), a.end(), 180);
if (it != a.end())
{
  cout << *it << endl;
}

§ 25.2.5

戻り値: 範囲 [first,last) 内の最初の反復子 i で、対応する次の条件が保持されます: *i == 値、pred(*i) != false、pred(*i) == false。そのような反復子が見つからない場合は、最後に戻ります。

範囲[first,last)は半分開いた範囲です。コンテナ内の最後の要素ではないことをlast意味します。end()

于 2013-10-07T02:09:43.787 に答える