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

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

我的印象是不能在 const 迭代器 上使用 erase。查看 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 应该使它失败。

最佳答案

行为已从 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

关于c++ - 为什么 const_iterator 可以与 std::map::erase 一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41255556/

相关文章:

c++ - 使用外部模板时出现链接器错误

c++ - 工厂能否通过查看特定文件以某种方式确定所有可能的类?

c++ - 是否允许递增结束迭代器?

c++ map/set 迭代器不可取消引用

c++ - 作为类型的功能?

c++ - Qt Parent 在 child 关闭后删除变量

c++ - GetDlgItemText 返回错误 1421

c++ - 关闭时的控制台关闭过程

c++ - 模板类的自动内存池功能

c++ - 在 std::map 中打印迭代器的索引