![](/img/trans.png)
[英]Why were the std::vector::erase parameters changed to const_iterator?
[英]Why const_iterator could be used with std::map::erase
我觉得一个人不能在const iterator
上使用erase
。 检查此代码 。
为什么以下代码编译(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
应该使它失败。
行为已从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
。
职位独立于其访问的常数。 执行搜索的函数返回const_iterator
是很常见的,因为它们实际上根本不会更改容器。 然而,期望将所获得的位置用于序列的突变,例如,在相应位置insert()
元素或者erase()
所定位的元素。 结果,扩展的容器支持使用const_iterator
进行变异操作。
相关论文似乎是N2350 。 我不确定这篇论文是否是最新版本。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.