0

私は効果的なstlを読んでいます。ここで立ち往生しました:

assoccontainer<int> c
for(container<int>::iterator i=c.begin();i!=c.end();++i)
  if(badvalue(*i))
    c.erase(i);

指定されたコードの問題は何ですか? そこの説明がわかりません。

他にも質問があります:

  1. とはassoccontainerどういう意味ですか? 関連記事が見つかりません。
  2. 何かbadvalueのキーワードですか?
4

3 に答える 3

5

アソクコンテナとはどういう意味ですか?

これは、などのある種の連想コンテナを意味しstd::setます。イタリック体で印刷されていることに注意してください。つまり、実際のコードではなく、実際のコンテナタイプのプレースホルダーです。

'badvalue'はある種のキーワードですか?

いいえ、これは、値をコンテナから削除する必要があるかどうかを判断するためにプログラムによって定義された関数であることを意味します。前のページで紹介されており、「次の述語がtrueを返すすべてのオブジェクトを削除しましょう」と書かれています。

与えられたコードの問題は何ですか

これは、コードサンプルの直後の本で説明されています。erase(i)イテレータを無効にします(つまり、イテレータでは何もできなくなります)。そのため、++i直後にイテレータを実行すると、未定義の動作が発生します。代わりに、同じページの後半のコードを使用する必要があります。

for (AssocContainer<int>::iterator i = c.begin(); i != c.end(); /* nothing */) {
    if (badValue(*i)) c.erase(i++);
    else ++i;
}

これは、古い値を消去して無効i にする前に増分します。

于 2012-12-14T10:01:22.810 に答える
2

assoccontainerbadvalue主な質問には関係ありません。ふりをするassoccontainerのは、何らかのコンテナであり、badvaluebool を返す関数です。主な問題は、要素を削除するために使用された後にイテレータを使用することです。eraseイテレータが無効になり、使用できなくなった後。

于 2012-12-14T10:06:51.343 に答える
0

assoccontainerは辞書またはハッシュマップに相当しますが、作成者(Scott Meyers?)は一般的な意味でそれを使用している可能性があります。AFAIK、STLにはその名前のコンテナはありません。これをstd::mapに置き換えます。私はそれがトリックをするべきだと思います。

詳細については、http: //en.wikipedia.org/wiki/Associative_containers_ (C%2B%2B )を参照してください。

文字列の出現をカウントするための優れた例があります。

おそらくScottMeyersは、badvalue()が、イテレータを使用して逆参照された値が有効かどうかを判断するユーザー定義関数であることを意味していました。

HTH。

于 2012-12-14T10:11:37.860 に答える