我正在尝试确定某个对象是否已包含在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。
答案 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.
}