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

时间:2016-12-21 05:13:12

标签: c++ c++11 iterator stdmap const-iterator

我的印象是,erase无法使用const iterator。检查this code
为什么以下代码编译(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;
}

map本身并不是一成不变的,但我的理解是const iterator会导致失败。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:9)

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

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