我的印象是不能在 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::erase以 const_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/