c++ - 有效地从 std::list 中删除最后一个元素

标签 c++ list c++11 stl std

这似乎是一个简单的问题,当然是可行的,但我想高效地完成它。

目标:
如果满足条件,则从 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();
}

关于c++ - 有效地从 std::list 中删除最后一个元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36804044/

相关文章:

python - 在 python 中将列表中的索引表示为 x,y

c++ - 在 std::enable_if 中使用 sizeof...

c++ - 如何将结构元素传递给异步线程?

c++ - 如何在没有等待结果的情况下触发内部循环异步任务

c++ - 游戏实体更新方法

c++ - C 和 C++ 中奇怪的类似函数的语法

list - 使用 lisp 中的嵌套列表删除列表的重复元素

条件数组的python for循环

c++ - 如何避免将 const-ref 返回到缓存中的临时文件

C++ 从使用 lambda 初始化的 C 样式函数指针访问私有(private)成员