#include<iostream>
#include<set> using namespace std; struct A{ string str; int score; }; void test(){ set<A>s; A a,b,c; a.str="shanying";a.score=100; b.str="shanying";b.score=0; c.str="baitoudiao";c.score=50; s.insert(a); /*s.insert(b); s.insert(c);*/ cout<<s.size()<<endl; } 像上面这代码,插入的时候就出错了,其他的暂时没发现错误。于是乎,set的元素不能为结构体么? |
|
|
肯定可以,C++的设计哲学之一就是使得程序在对待自定义类型时和内置类型必须是一致的(甚至自定义类型的支持更好)。所以,肯定是你程序的问题,如下:
《C++标准程序库》中明确指出:“只要是 assignable、copyable、comparable(根据某个排序准则)的型别T,都可以成为set或multiset的元素型别。”。其中,所谓的comparable指的是less,即可进行<比较。 反之,则不被支持,所以,问题是,你的A是否支持上述三种语义? 看下面的测试代码:
输出: orign:shanying,100 copy:shanying,100 assigned:shanying,100 所以,A满足assignable以及copyable,但是不满足comparable,所以,它不能用于set容器。为了达到目的,需要做的就是添加一个对operator<的重载。 参考修正后的代码:
编译可通过,输出为: orign:shanying,100 copy:shanying,100 assigned:shanying,100 a<b?false size:3 |