我想在这里简化我的问题。我有一个结构,int数组作为成员变量。
struct elem
{
elem (int a, int b, int c) {id[0]=a; id[1]=b; id[2]=c;}
int id[3];
};
我想把elem指针放到std :: set中,我希望稍后使用find()从该集合中搜索特定对象,所以我想为这个std :: set提供自定义比较器。
struct compare
{
bool operator() (elem *one, elem *two )
{
// logic
}
};
int main(int argc, char* argv[])
{
std::set< elem *, compare> elemSet;
std::set< elem *, compare>::iterator itr;
elem ob1(2,5,9), ob2(5,9,7), ob3(4,3,7);
elemSet.insert(&ob1);
elemSet.insert(&ob2);
elemSet.insert(&ob3);
elem temp(4,3,7);
itr = elemSet.find(&temp);
if(itr != elemSet.end())
{
cout << endl << (*itr)->id[0] << " " << (*itr)->id[1] << " " << (*itr)->id[2];
}
return 0;
}
请帮我解决比较器的逻辑问题?是否有任何大小的数组的通用逻辑?
答案 0 :(得分:2)
由于std::set
(以及std::map
及其multi
变体)需要strict-weak ordering,因此您需要通过比较器提供该排序。严格弱的排序要求
(x < x) == false
(x < y) == !(y < x)
((x < y) && (y < z)) == (x < z)
对于具有许多成员的类,实现起来可能很复杂(如果您愿意,数组只是成员的集合)。
在this question of mine中,我问过通过tuple
和tie
实施严格弱排序是否合理,这使得它变得非常容易:
struct compare
{
bool operator() (elem const* one, elem const* two )
{ // take 'tie' either from Boost or recent stdlibs
return tie(one->id[0], one->id[1], one->id[2]) <
tie(two->id[0], two->id[1], two->id[2]);
}
};
另请注意,我将参数作为指针 - const
。