【发布时间】:2016-01-25 15:26:51
【问题描述】:
我刚刚写了下面的代码,很惊讶它没有编译:
std::deque<int> container;
// filling the container...
for (auto it = container.rbegin(); it != container.rend(); ++it)
if (*it == 5)
{
container.erase(it);
break;
}
如您所见,我想删除最后一个符合特定条件的元素(如果有)。
错误是
没有匹配的调用函数 std::deque::erase(std::reverse_iterator...
一开始我不相信它是由反向迭代器引起的,但确实如此,因为将rbegin/rend 替换为begin/end 解决了它。
所以,两个问题:
- 为什么不支持此功能?这仅仅是 C++ 委员会忘记包含在标准中的那些小东西之一,还是缺少这种重载的理由?
- 什么是做我想做的最优雅的方式?我是否坚持按索引进行迭代?
【问题讨论】:
-
我想你的答案就在这里:stackoverflow.com/questions/1830158/…
-
m_container和container一样吗? -
@Violet - 原因 是
rend()不能在开始之前返回迭代器,因为没有类似的东西。所以它改为持有begin()并将其所有访问调整 1 以进行补偿。 -
@VioletGiraffe 你说得对,我是个白痴。尽管如此,本着尽可能使用
<algorithm>的精神,我还是建议使用erase和find_if(container.rbegin()...的结果(即使它不会减少行数)。 -
@screwnut 不,我认为您坚持将 OP 从清晰、易于理解的代码切换到更神秘的代码,这绝对没有充分的理由。你的第一个建议甚至是悲观的。重点是什么? “本着尽可能使用
的精神” Cargo cult programming = bad.
标签: c++ containers erase