2016-04-22 271 views
8

这看起来像一个简单的问题,它当然是可行的,但我想有效地做到这一点。有效地从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迭代器,但编译器不喜欢这种情况。

删除使用一个反向迭代双向列表的列表元素似乎是一个合理的事情。有什么明显的我在这里失踪?

+0

你可以在反向迭代器上调用'base()',但你需要自己照顾正确的偏移量。 –

+0

@KerrekSB你能详细点吗?我不太了解迭代器知道如何使用您的建议。 – vacuumhead

+5

我可能在这里错过了一个潜台词,[但是为什么不'pop_back'?](http://en.cppreference.com/w/cpp/container/list/pop_back) – user4581301

回答

8

我想,可以简化您的代码段做下一个方法:

while (!mylist.empty() && mylist.back()->Type() == unwanted) { 
    mylist.pop_back(); 
} 
+2

'mylist.back() - > Type()== unwanted'更简单。 – SirGuy

+0

@GuyGreer完全同意你的看法,编辑我的答案。 –

相关问题