17

我的印象是无法eraseconst 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 回答