我正在尝试在项目中使用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;
}
但运行后我收到错误,我无法理解为什么会这样。
任何想法出了什么问题?
答案 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(),则应返回一些默认值,而不是取消引用它,因为如果这样做,则会导致未定义的行为。如果运气好,你的程序就会崩溃。