这看起来像一个简单的问题,它当然是可行的,但我想有效地做到这一点。有效地从std :: list中删除最后一个元素
目标:
如果满足条件,则从std :: list中删除最后一个元素。
的问题:
我的编译器(MSVC++ 10)是不满铸造一个反向迭代为常量迭代方法调用到std :: list.erase()。该消息是:
error C2664: 'std::_List_iterator<_Mylist> std::list<_Ty>::erase(std::_List_const_iterator<_Mylist>)' : cannot convert parameter 1 from 'std::reverse_iterator<_RanIt>' to 'std::_List_const_iterator<_Mylist>'
我试过验证码:
std::list<mytype> mylist;
// lots of code omitted for clarity
bool ends_badly = true;
while(ends_badly && mylist.size() > 0)
{
auto pos = mylist.crbegin(); // Last element in the list
if ((*pos)->Type() == unwanted)
{
mylist.erase(pos); // Here is where the compiler complains
}
else
{
ends_badly = false;
}
}
我能解决这个问题,通过使用前向迭代器,并通过列表来结束循环,但这是如此繁琐。在这种情况下,编译器可以使用前向迭代器,我尝试将一个反向迭代器转换为一个const迭代器,但编译器不喜欢这种情况。
删除使用一个反向迭代双向列表的列表元素似乎是一个合理的事情。有什么明显的我在这里失踪?
你可以在反向迭代器上调用'base()',但你需要自己照顾正确的偏移量。 –
@KerrekSB你能详细点吗?我不太了解迭代器知道如何使用您的建议。 – vacuumhead
我可能在这里错过了一个潜台词,[但是为什么不'pop_back'?](http://en.cppreference.com/w/cpp/container/list/pop_back) – user4581301