有效地从 std::list 中删除最后一个元素
Efficiently remove last element from std::list
这似乎是一个简单的问题,当然是可行的,但我想有效地做到这一点。
目标:
如果最后一个元素满足条件,请从 std::list 中删除它。
问题:
我的编译器 (MSVC++ 10) 对将反向迭代器转换为 const 迭代器以调用 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 迭代器,但编译器也不喜欢这样。
使用反向迭代器从双向列表中擦除列表元素似乎是一件合理的事情。我在这里缺少什么明显的东西吗?
我想
你可以用下一种方式简化你的代码片段:
while (!mylist.empty() && mylist.back()->Type() == unwanted) {
mylist.pop_back();
}
修复代码中的特定错误 我可以将反向迭代器转换为正向迭代器吗?
mylist.erase((pos+1).base());
使用 std::reverse_iterator::base
base
迭代器是指(从std::reverse_iterator::iterator_type
角度)reverse_iterator
当前指向的元素的下一个元素。
无论如何,pop_back
是您的最佳选择。
相关文章:
- 避免在使用链接列表从 deque 中删除最后一个节点时出现内存泄漏
- std::字符串擦除以删除最后一个字母
- 在弦乐器中删除最后一个字符
- 如何删除最后一个逗号
- 删除最后一个节点,并将尾部更新到最后一个节点
- 试图删除最后一个std ::向量元素时,程序会崩溃
- 有效地从 std::list 中删除最后一个元素
- std::vector::erase删除最后一个元素而不是第一个元素
- 如何删除最后一个字符
- getAverage() 删除最后一个元素
- 单链表删除最后一个节点
- C++密码程序,字符串在后排时不会删除最后一个字符
- 从链表c++中删除最后一个节点
- c++ STL vector.erase()总是删除最后一个元素
- Multi_index_container删除最后一个元素
- V8 C++,从数组中删除最后一个元素
- List的析构函数无法删除最后一个节点
- 链表删除最后一个节点c++
- 从使用sstream读取的单词中删除最后一个空格的最佳方法
- Visual Studio c++从字符串中删除最后一个字符