【问题标题】:erasing an element of a static member of class list擦除类列表的静态成员的元素
【发布时间】:2016-09-08 02:09:24
【问题描述】:

我有以下课程。它有一个静态成员_list,由该类的所有实例共享,该成员将在Class_f() 中创建。我想使用擦除功能来擦除_list 的最后一个元素。

class myClass 
{
    private:
        static list<int> _list;
    public:
        //constructors,destructors
        void Class_f();
}

list<int> myCLass::_list;

void myClass::Class_f() 
{
    //..some code
    list<int>::iterator it1;
    it1=_list.end (); //erase for instance the last element _list
    it1=_list.erase(it1);
    //more code
}

但是,当编译它时,我会输出一条错误消息“列表迭代器不可递增”。为什么它给我这个错误?另外,为什么我不能使用像_list.erase(_list.end()) 这样更简单的东西以避免创建迭代器。

【问题讨论】:

  • _list.rbegin() 应该是列表中的最后一个元素。

标签: c++


【解决方案1】:

_list.pop_back() 可以删除最后一个元素,这可能比使用erase 函数更方便。

http://www.cplusplus.com/reference/list/list/pop_back/

【讨论】:

    【解决方案2】:

    首先,list.end() 给你一个“指向过去元素的迭代器”。所以调用 erase(list.end()) 是行不通的。

    其次,使用 list.pop_back() 删除最后一个元素。 List.pop_back()

    【讨论】:

      【解决方案3】:

      _list.end() 不是最后一个元素的迭代器。它是一个过去的迭代器。你真的不能用它做任何事情。 C++'s iterator ranges are half-open.

      但是,如果您确实遇到了 编译器 错误,则说明您没有向我们展示某些错误。

      您更有可能看到来自运行时的调试器消息,其中调试模式下的标准库实现非常友好地发现您尝试增加 _list.end()(这将具有未定义的行为),这发生在准备返回值期间为_list.erase(it1) 并告诉你不要这么傻。 :)

      【讨论】:

      • 对不起,我的意思应该是“调试器消息”。无论如何,错误恰恰来自访问超过列表大小的元素。我怎样才能访问最后一个元素?
      • @SrIncerteza:您是否失去了互联网访问权限?您只需阅读std::list 的文档即可找到答案。其他答案也告诉您使用哪个(尽管我更愿意留下一些东西让您自己发现)。
      猜你喜欢
      • 1970-01-01
      • 2014-04-06
      • 1970-01-01
      • 2012-06-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-05
      • 1970-01-01
      相关资源
      最近更新 更多