首次构造时,std :: list是否为空 - 即使它是类的成员?

时间:2010-10-26 16:21:47

标签: c++ list iterator

我已经定义了一个包含std::list成员的类。当我创建该类的对象时,我希望std :: list为空。但是,我查询begin()end()返回的迭代器,发现它们不相等。

如何在初始构造对象时确保我的std :: list成员为空?

以下是我班级的代码:

typedef int ShapeHandle;
typedef void o_gadget;

class Gadget
{
public:
    Gadget( int c_id, int g_id, void * desc, size_t numbytes ):
        class_id(c_id), gadget_id(g_id)
        {
            memory = malloc( numbytes );
            father = 0;
            rightbro = 0;
            leftbro = 0;
            firstchild = 0;
            lastchild = 0;
            active = false;
            update = false;
        }
    void * memory;
    std::list<ShapeHandle> myshapes;
    std::list<o_gadget *> children;

    int class_id;
    int gadget_id;
    o_gadget * father;
    o_gadget * rightbro;
    o_gadget * leftbro;
    o_gadget * firstchild;
    o_gadget * lastchild;
    bool active;
    bool update;
};

我比较了这样的迭代器:

    ... 
    // search the tree stopping when we find the ID
Gadget * info = gadgets[from];
std::list<o_gadget *>::iterator iter = info->children.begin();
while( target == 0 && iter != info->children.end()  )
{
    FindGadget(ID, *iter, target);
    iter++;
}
    ... 

我没想到在检查新的Gadget时会输入while循环。我知道target == 0是真的,所以我认为iter != info->children.end()也是如此。但是,我没有在调试器中检查这些值。

修改

我很抱歉。这显然是错误的。我又做了我发布了一个实际上并不存在的错误。我现在无法重现它。你们都可以投票关闭吗 - 或者我可以自己关闭这件事吗?

6 个答案:

答案 0 :(得分:5)

默认情况下,std :: list的对象是空的,因此begin()应该等于end()。

我在Gadget类中没有看到任何错误,并且进行简单的检查表明'children'成员变量实际上是空的:

#include <iostream>
#include <list>

class Gadget
{
// ...
};

int main()
{
    Gadget g(0, 0, 0, 0);
    std::cout << (g.children.begin() == g.children.end()) << std::endl;
}

它打印1因为(begin()== end())计算结果为true。

你构建了'小工具'数组吗?

答案 1 :(得分:3)

您如何确定begin()end()正在返回不同的迭代器?如果您正在调试器中检查它们的值,除非您知道operator==如何在迭代器上工作,否则这不会告诉您太多。

empty()方法可以直接告诉您列表是否为空。

编辑问题几乎可以肯定是Gadget * info = gadgets[from];行,它返回一个指向包含一些你没有告诉我们的东西的小工具的指针,或者更可能是一个完全无效的指针。

答案 2 :(得分:2)

对于新构造的列表,list :: empty()是否返回TRUE?

答案 3 :(得分:2)

新构造的列表(没有构造函数参数)将为空。

begin()end()在调试器中看起来不一样,因为它们都是每次调用时新构造的迭代器。

他们不平等是什么意思? begin() == end()会返回false或其他内容吗?

答案 4 :(得分:2)

这是一个程序(对我来说)正确打印“1”,表明迭代器是相等的。如果您逐渐将程序更改为此程序,则更改行为的步骤可能会告诉您错误:

#include <iostream>
#include <list>
#include <cstdlib>

typedef int ShapeHandle;
typedef void o_gadget;

class Gadget
{
public:
    Gadget( int c_id, int g_id, void * desc, size_t numbytes ):
        class_id(c_id), gadget_id(g_id)
        {
            memory = std::malloc( numbytes );
            father = 0;
            rightbro = 0;
            leftbro = 0;
            firstchild = 0;
            lastchild = 0;
            active = false;
            update = false;
        }
    void * memory;
    std::list<ShapeHandle> myshapes;
    std::list<o_gadget *> children;

    int class_id;
    int gadget_id;
    o_gadget * father;
    o_gadget * rightbro;
    o_gadget * leftbro;
    o_gadget * firstchild;
    o_gadget * lastchild;
    bool active;
    bool update;
};

int main() {
    Gadget g(1,2,0,12);
    std::cout << (g.children.begin() == g.children.end()) << "\n";
}

答案 5 :(得分:1)

确保父类的所有构造函数在其初始化列表或其函数体中显式初始化列表成员。