2016-12-21 8 views
16

const iteratoreraseを使用できないという印象を受けました。 this codeを確認してください。
なぜ以下のコードがコンパイルされますか(C++ 11、gcc)?const_iteratorをstd :: map :: eraseと一緒に使用できる理由

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; 
} 

map自体は一定ではないが、私の理解では、const iteratorが、これは失敗させるべきであるということです。

答えて

15

動作がC++ 11から変更されました。 std::map::eraseは、パラメータとしてconst_iteratorをとります。 std::map::eraseについて

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

、渡された反復子は、単に要素ではなく、それを介して要素を変更するため、削除される位置として使用されます。つまり、const_iteratorは問題ありません。 C++ 11以前では、const_iteratorのサポートはあまり良くありませんでしたが、状況はC++ 11から変更されました。できるだけ早くiteratorの代わりにconst_iteratorを使用する必要があります。

9

ポジションは、アクセスの定数とは無関係です。彼らは実際にコンテナを全く変更しないので、検索を行う関数がconst_iteratorを返すのはかなり一般的でした。しかしながら、配列の突然変異のために得られた位置、例えば対応する位置にあるinsert()または配置された要素には使用することが望ましい。結果として、コンテナは、変更操作でconst_iteratorの使用をサポートするように拡張されました。

N2350と思われます。この論文が最新版であるかどうかはわかりません。

関連する問題