STL列表<mystruct>返回问题</mystruct>

时间:2011-04-09 15:23:23

标签: c++ list stl iterator next

我正在尝试在项目中使用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;
}

但运行后我收到错误,我无法理解为什么会这样。

任何想法出了什么问题?

3 个答案:

答案 0 :(得分: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的代码中再次检查nullptr(或Myclass::next)。

答案 1 :(得分: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
}

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

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

答案 2 :(得分:0)

问题在于:

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

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