繁体   English   中英

C ++ std :: set订购不适用于客户类*

[英]C++ std::set ordering not working with customer class*

我使用了一组指向自定义抽象类的指针:

std::set<Item*>* Stuff;

我创建了两个期刊对象(具体类,单一继承),它们存储一个字符串和一个客户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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM