我正在使用一组指向自定义抽象类的指针:
std::set<Item*>* Stuff;
我创建了两个 Periodical 对象(具体类,单继承),它们存储一个字符串和一个客户 Date 对象。然后我将两者都插入到集合中。
Date bDate(20140302);
Periodical* B = new Periodical("b", bDate);
Date aDate(20140301);
Periodical* A = new Periodical("a", aDate);
poo->insert(B);
poo->insert(A);
接下来,我运行几行代码来确认对象 A < B 并“按顺序”打印集合。
if(*A == *B) { std::cout << "*A == *B" << std::endl;}
if(*A < *B) { std::cout << "*A < *B" << std::endl;}
if(*A > *B) { std::cout << "*A > *B" << std::endl;}
//print in order from beginning to end
for (std::set<Item*>::iterator it=poo->begin(); it!=poo->end(); ++it) {
std::cout << ' ' << **it << std::endl;
}
问题是:
*A < *B
20140302 b
20140301 a
所以我心想,当然,也许我正在使用指针,这就是 std::less 不起作用的原因。然后我试试这个:
std::set<Item*, std::less<Item**>>* Periodicals2 = new std::set<Item*, std::less<Item**>>();
Date bDate(20140302);
Periodical* B = new Periodical("b", bDate);
Date aDate(20140301);
Periodical* A = new Periodical("a", aDate);
Periodicals2->insert(B);
Periodicals2->insert(A);
...并得到一些可怕的 STL 降级错误:
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/c++/v1/__tree:1596:17: error: no matching function for call to object of type 'value_compare' (aka 'std::__1::less<Item **>')
我哪里出错了??
最佳答案
大家的评论都是对的。当然,它工作正常,除了我正在排序指针地址而不是我真正想要的。
一旦你把我从死亡漩涡中拉出来,我就开始考虑定义我自己的比较器:
std::set<Item*, std::less<Item**>>* poo2 = new std::set<Item*, std::less<Item**>>();
不幸的是,该行显示零语法错误,但它抛出了这个错误:
1596:17: error: no matching function for call to object of type 'value_compare' (aka 'std::__1::less<Item **>')
我想我可能犯了一些时髦的语法错误所以我只是搜索了一下并定义了我自己的比较:
struct compare {
bool operator()(const Item* lhs, const Item* rhs) const {
return *lhs < *rhs;
}
};
..这正是我所期望的:
20140301 a
20140302 b
关于C++ std::set 排序不适用于客户类*,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22191739/