列表迭代器不可递增? - 运行时错误

时间:2012-11-21 20:59:13

标签: c++ debugging stl runtime

我试图在列中创建列表,但遇到了这个名为:

的运行时错误
  

调试断言失败!表达式:列表迭代器不可递增

我无法弄清问题是什么。这是代码:

// Core.cpp //

#include "Core.h"

class List {
private:
    int Size;
    int Values;
    list<int> Data;
    list<int>::iterator IT;
public:
    List(int S, int V) {Size = S; Values = V;}
    void MakeList();
    void TargetElement(int Element);
    void ChangeElement(int Value);
    void DisplayList();
};

void List::MakeList() {
    list<int> Data(Size, Values);
    list<int>::iterator IT = Data.begin();
}

void List::TargetElement(int Element) {
    advance(IT, Element);
}

void List::ChangeElement(int Value) {
    list<int>::iterator INSERT = Data.begin();
    Data.insert(INSERT, Value);
}

void List::DisplayList() {
    list<int>::iterator OUTPUT;
    for(OUTPUT = Data.begin(); OUTPUT != Data.end(); OUTPUT++) {
        //cout << *OUTPUT << endl;
    }
}

int main() {

    List Container(10, 0);
    Container.MakeList();
    Container.TargetElement(3);
    Container.ChangeElement(20);
    Container.DisplayList();

    cin.get();
    return 0;
}

有关如何解决此问题的任何建议?

编辑:我到处寻找答案,我似乎仍无法找到解决方案。调试和找到断点也没有帮助。

4 个答案:

答案 0 :(得分:1)

ITTargetElement()内无效,因为IT它是从Data内的局部变量MakeList()获取的迭代器,因为Data被重新声明:

void List::MakeList() {
    list<int> Data(Size, Values);          // 'Data' is destructed when
    list<int>::iterator IT = Data.begin(); // this method returns.
}

我不确定为什么MakeList()甚至存在,在构造函数中执行初始化:

List(int S, int V) : Size(S), Values(V), Data(S, V) {}

并删除MakeList()。如果您选择此方法,请注意SizeValues可以从课程中删除,因为在构造之外不需要它们。

答案 1 :(得分:1)

对于初学者来说,这会使一个名为list<int>的本地Data,然后将一个名为IT的本地迭代器分配给它的第一个元素。这对您的成员变量DataIT没有任何作用。

void List::MakeList() {
    list<int> Data(Size, Values);
    list<int>::iterator IT = Data.begin();
}

应该是:

void List::MakeList() {
    Data.resize(Size, Values);
    IT = Data.begin();
}

使用它运行并查看它的使用位置。

答案 2 :(得分:1)

问题在于:

void List::MakeList() {
    list<int> Data(Size, Values);
    list<int>::iterator IT = Data.begin();
}

这不会初始化类的数据和IT成员,它只会创建名为Data和IT的局部变量,一旦MakeList返回就会消失。要初始化这些成员,请将构造函数更改为:

List(int S, int V) : Data(S, V), IT(Data.begin()), Size(S), Values(V)
{
}

顺便说一下,你不需要Size成员,因为std :: list已经存储了它的大小(你可以通过调用std :: list :: size来获取它。)

答案 3 :(得分:0)

void List::MakeList() {
    list<int> Data(Size, Values);
    list<int>::iterator IT = Data.begin();
}

这是创建两个局部变量,它们隐藏了类的成员变量。您将收到运行时错误,因为类的IT成员变量永远不会设置为实际列表对象的迭代器。你想要的是合并MakeList和你的构造函数。这就是构造函数的用途。