17

私は 1 つは使用できない印象を受けeraseましたconst iteratorこのコードを確認してください。
以下のコードがコンパイルされるのはなぜですか (C++11、gcc)?

long getMax(const bool get_new)
{
    long max_val=0;

    TO now=getNow();

    map<TO, long>& m=get_new?m_new:m_old;

    for(auto it=m.cbegin(); it !=m.cend())
    {
        if(now.compareTime((*it).first)<lookback)
        {
            max_val=max(max_val,
                        (*it).second);
            ++it;
        }
        else
        {
            it=m.erase(it);
        }
    }

    return max_val;
}

マップ自体は一定ではありませんが、私の理解では、これconst iteratorは失敗するはずです。

4

2 に答える 2

16

動作は C++11 から変更されました。std::map::eraseconst_iteratorはそのパラメータとして取ります。

void erase( iterator pos );           // (until C++11)
iterator erase( const_iterator pos ); // (since C++11)
iterator erase( iterator pos );       // (since C++17)

の場合std::map::erase、渡された反復子は、要素を変更するためではなく、要素が削除される位置としてのみ使用されます。というconst_iteratorことでいいでしょう。C++11 より前は のサポートconst_iteratorがあまり良くありませんでしたが、C++11 から状況が変わりました。const_iterator現在可能な場合は代わりに使用する必要がありますiterator

于 2016-12-21T05:17:20.377 に答える
9

位置は、アクセスの一貫性とは無関係です。const_iterator実際にはコンテナーをまったく変更しないため、検索を実行する関数が返されることは非常に一般的でした (そうですか?) 。しかしながら、得られた位置を配列の変異、例えば、insert()対応する位置のerase()エレメントまたは配置されたエレメントに使用することが望ましい。その結果、const_iterator変更操作での使用をサポートするためにコンテナが拡張されました。

関連する論文はN2350のようです。この論文が最新版かどうかはわかりません。

于 2016-12-21T05:17:58.560 に答える