我有一套指针,我想以确定的方式进行迭代。显然,如果我使用默认的排序顺序进行设置,这将基于指针的内存地址,每当程序运行时内存地址可能会不同。所以我定义了一个我想使用的自定义比较器,但我不想更改该集合的模板类型(因为它在代码中有100万个地方使用),所以我想将一个比较器对象传递给设置构造函数是从std :: less得到的自定义比较器通过显式构造函数进行排序std :: set
class TestClass
{
public:
TestClass(int id_) : id(id_) {}
~TestClass() {}
int getId() const { return id;}
void setId(int id_) { id = id_; }
private:
int id;
};
struct TestClassLessThan : public std::less<TestClass*>
{ // functor for operator<
bool operator()(const TestClass* &_Left, const TestClass* &_Right) const
{ // apply operator< to operands
return (_Left->getId() < _Right->getId());
}
};
int main(void)
{
TestClassLessThan comp;
set<TestClass*> testSet(comp), testSet2(comp);
TestClass* obj1 = new TestClass(1);
TestClass* obj2 = new TestClass(2);
testSet.insert(obj1);
testSet.insert(obj2);
TestClass* obj = *(testSet.begin());
cout << "First run" << endl;
BOOST_FOREACH(TestClass* o, testSet) // expecting 1,2 - get 1,2
cout << o->getId() << endl;
// now change the ordering (based on id) and insert into a new set in the same order
obj1->setId(3);
testSet2.insert(obj1);
testSet2.insert(obj2);
cout << "Second run" << endl;
BOOST_FOREACH(TestClass* o, testSet2) // expecting 2,3 - get 3,2
cout << o->getId() << endl;
delete obj1;
delete obj2;
}
所以我的问题是,我忘记了什么?
这是完美的...但是你说如果我在一个类中声明了集,但是它被传递给另一个不包含该自定义的类 - 第二个类可能会有不同/未定义的行为?我想我会确保这个集合的定义和它的访问器方法都包含了非定制专业化。 –
2010-12-13 21:11:53