确定对象是否在std :: set中

时间:2009-05-04 16:40:28

标签: c++ stl set

我正在尝试确定某个对象是否已包含在std::set中。根据msdn(和其他来源),如果找不到你要求的元素,set :: find函数应该返回end()

但是当我实现如下代码时,set::find会返回垃圾邮件(0xbaadf00d)。

set<Cell*> cellSet;

Cell* cell = new Cell();    

if (cellSet.find(cell) == cellSet.end())
{
    ...
}

我是否正确使用此功能?我正在使用Visual C ++ 2005。

5 个答案:

答案 0 :(得分:10)

您发布的代码将始终执行if中的代码,而0xbaadf00d 是实现的“一个接一个”标记。

答案 1 :(得分:5)

使用stl set时,我喜欢使用count函数来确定成员资格。我认为这使代码更容易阅读。

set<Cell*> cellSet;

Cell* cell = new Cell();    

if (cellSet.count(cell) == 0)
{
    ...
}

答案 2 :(得分:1)

callSet.end()的值是否也是0xbaadf00d?

修改

我在VS2008中运行了这个示例代码,一切都按预期工作。 find函数返回一个指向原始值的迭代器。

你到底看到了什么样的行为?它是返回end()还是返回集合中的另一个位置?

答案 3 :(得分:0)

尝试编译并运行只是您提供的代码段,我保证您会发现它没有问题。问题几乎可以肯定是由于程序中其他地方发生的内存分配错误,例如引用未初始化的指针或指向delete d的对象的指针。

您是否熟悉C ++容器如何管理其对象?他们不会删除指针。在可能的情况下,使用对象容器而不是指向对象的指针总是更安全。 (有些情况下需要指针容器 - 特别是当您希望容器从单个类层次结构中存储不同类型的对象时。)

答案 4 :(得分:0)

一个简单的错误是你应该测试不等于结束。

set<Cell*> cellSet;
Cell* cell = new Cell();
if (cellSet.find(cell) != cellSet.end())     // Test NOT EQUAL to end
{
     // Found item in set.
}

但是你也应该注意到你没有比较实际的Cell值,而是指向Cell对象的指针(可能是你想要的也可能不是你想要的)。通常在C ++中,您不倾向于将指针存储在容器中,因为没有隐含的指针所有权,但是没有时间可以。

要实际比较需要使用find_if()的对象并传递谓词(仿函数)。

struct PointerCellTest
{
    Cell&  m_lhs;
    PointerCellTest(Cell* lhs): m_lhs(lhs) {}
    bool operator()(Cell* rhs)
    {
         return lhs.<PLOP> == rhs.<PLOP>
    }
};


if(find_if(cellSet.begin(),cellSet.end(),PointerCellTest(cell)) != cellSet.end())
{
     // Found item in set.
}