为什么const_iterator可以与std :: map :: erase一起使用

chr*_*ise 17 c++ iterator stdmap const-iterator c++11

我下的印象,一个不能使用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;
}
Run Code Online (Sandbox Code Playgroud)

该地图本身不是恒定的,但我的理解是,const iterator应该使这一失败.

son*_*yao 16

行为已从C++ 11改变; 的std ::地图::擦除需要const_iterator作为参数.

void erase( iterator pos );           // (until C++11)
iterator erase( const_iterator pos ); // (since C++11)
iterator erase( iterator pos );       // (since C++17)
Run Code Online (Sandbox Code Playgroud)

因为std::map::erase,传递的迭代器仅用作删除元素的位置,而不是用于通过它修改元素.这意味着没问题const_iterator.在C++ 11之前,对它的支持const_iterator不是很好,但情况已经从C++ 11改变了.您应该使用const_iterator而不是iterator在可能的情况下使用.


Die*_*ühl 9

职位独立于其访问的常数.执行搜索返回的函数很常见(const_iterator因为它们实际上根本不更改容器).然而,期望将所获得的位置用于序列的突变,例如,insert()对应于相应位置的元件或erase()定位的元件.因此,容器扩展到支持使用const_iterator变异操作.

相关论文似乎是N2350.我不确定这篇论文是否是最新版本.