我正在尝试确定对象是否已包含在 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。

有帮助吗?

解决方案

您发布的代码将始终执行中的代码(如果),并且 0xbaadf00d 实现的“一个接一个”端&QUOT;标记

其他提示

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

set<Cell*> cellSet;

Cell* cell = new Cell();    

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

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

修改

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

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

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

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

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

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.
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top