0

我正在尝试在项目中使用 STL 列表,但我遇到了以下问题。

我希望我的列表存储一个结构。比如这个

struct mystruct
{
    int x;
    int y;
};

然后我使用迭代器来访问列表中的每个结构,就像这样。

list<mystruct> L;
list<mystruct>::iterator lit;
for(lit=L.begin();lit!=L.end();lit++) 
    {
        if(lit->x==1) cout << "<NUM," << lit->x << "> ";
        if(lit->y==2) cout << "<ID," << lit->y << "> ";
    }

这行得通,但我想一次得到一个结构,所以我做了这个函数

mystruct Myclass::next(void)
{
    if(lit!=L.end()) 
    {
        lit++;
    }
    return *lit;
}

但是运行它后我得到一个错误,我不明白为什么会发生这种情况。

任何想法出了什么问题?

4

3 回答 3

2
mystruct Myclass::next(void)
{
    if(lit!=L.end()) 
    {
        lit++;
    }
    return *lit;
}

除非您已经在末尾,否则您会递增,但每次都会取消引用,无论您是否在末尾。为了解决这个问题,考虑返回一个指针,0如果你在最后,再返回一个指针。

mystruct* Myclass::next(void)
{
    if(lit!=L.end() && ++lit != L.end()) 
    {
        // dereference to get the struct, and then return the address of the struct
        return &*lit;
    }
    return 0;
    // or nullptr in C++0x
}

然后在您使用的代码中再次检查0(或) 。nullptrMyclass::next

于 2011-04-09T15:26:07.427 回答
1

如果您正在编写next() 返回一个对象(而不是指针),那么我认为您还需要编写has_next()函数,您应该调用该函数来检查列表中是否有项目,然后再调用next(). 像这样的东西:

bool has_next()
{
   list<mystruct>::iterator temp = lit;
   return ++temp != L.end();
}

mystruct Myclass::next(void)
{
    if( !has_next()) 
    {
         throw "end of the list is reached";
    }
    ++lit;
    return *lit;
}

//usage
while(myClassInstance.has_next())
{
      mystruct s = myClassInstance.next();
      //work with s
}

或者,如果您决定返回指向mystructfrom的指针next(),则has_next()不需要。你可以这样写:

mystruct *  Myclass::next(void)
{
    ++lit;
    if( lit == L.end() ) 
         return NULL;
    return &(*lit);
}
于 2011-04-09T15:33:08.583 回答
0

问题在这里:

mystruct Myclass::next(void)
{
    if(lit!=L.end()) 
    {
        lit++;
    }
    return *lit;
}

首先 lit 是如何定义的?
其次,如果 lit 等于 L.end() 您应该返回一些默认值,而不是取消引用它,因为如果这样做,您将导致未定义的行为。如果你幸运的话,你的程序会崩溃。

于 2011-04-09T15:28:34.697 回答