我刚刚写了下面这段代码,很惊讶它没有编译通过:
std::deque<int> container;
// filling the container...
for (auto it = container.rbegin(); it != container.rend(); ++it)
if (*it == 5)
{
container.erase(it);
break;
}
如您所见,我想删除与特定条件匹配的最后一个元素(如果有的话)。
错误是:
no matching function for call to std::deque::erase(std::reverse_iterator...
起初我不相信这是由反向迭代器引起的,但实际上情况确实如此,因为用begin
/end
替换rbegin
/rend
可以解决问题。
所以,两个问题:
- 为什么不支持这种方式?这只是C++委员会忘记在标准中包含的小事之一,还是缺少这种重载的正当理由?
- 实现我想要的最优雅的方法是什么?我必须使用索引进行迭代吗?
reverse_iterator::base
指向它所指向的位置:(: http://www.drdobbs.com/cpp/three-guidelines-for-effective-iterator/184401406?pgno=3 - Violet Girafferend()
无法返回一个指向begin之前的迭代器,因为这样的迭代器并不存在。所以它会持有begin()
并通过调整所有访问来进行补偿。 - Bo Persson<algorithm>
,我建议使用erase
与find_if(container.rbegin()...)
的结果(即使它并不能减少代码行数)。 - screwnut