set 结构体
C++的設計哲學之一就是使得程序在對待自定義類型時和內置類型必須是一致的(甚至自定義類型的支持更好)。所以,肯定是你程序的問題,如下:
《C++標準程序庫》中明確指出:“只要是 assignable、copyable、comparable (根據某個排序準則)的型別T,都可以成為set或multiset的元素型別。”。其中,所謂的comparable指的是less,即可進行<比較。
反之,則不被支持,所以,問題是,你的A是否支持上述三種語義?
看下面的測試代碼:
C/C++ code ?
輸出:
orign:shanying,100
copy:shanying,100
assigned:shanying,100
所以,A滿足assignable以及copyable,但是不滿足comparable,所以,它不能用于set容器。為了達到目的,需要做的就是添加一個對operator<的重載。
參考修正后的代碼:
C/C++ code ?
編譯可通過,輸出為:
orign:shanying,100
copy:shanying,100
assigned:shanying,100
a<b?false
size:3
《C++標準程序庫》中明確指出:“只要是 assignable、copyable、comparable (根據某個排序準則)的型別T,都可以成為set或multiset的元素型別。”。其中,所謂的comparable指的是less,即可進行<比較。
反之,則不被支持,所以,問題是,你的A是否支持上述三種語義?
看下面的測試代碼:
C/C++ code ?
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | 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; A?cpy(a); cout<<"orign:"<<a.str<<','<<a.score<<endl; cout<<"copy:"<<cpy.str<<','<<cpy.score<<endl; A?assigned; assigned?=?a; cout<<"assigned:"<<assigned.str<<','<<assigned.score<<endl; //?cout<<"a<b?"<<(a<b?"true":"false")<<endl;???????無法通過編譯 } |
輸出:
orign:shanying,100
copy:shanying,100
assigned:shanying,100
所以,A滿足assignable以及copyable,但是不滿足comparable,所以,它不能用于set容器。為了達到目的,需要做的就是添加一個對operator<的重載。
參考修正后的代碼:
C/C++ code ?
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | #include?<iostream> #include?<string> #include?<set> using?namespace?std; struct?A{ string?str; int?score; }; bool?operator<(const?A&?lhs,?const?A&?rhs)?{ ????return?lhs.score<rhs.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; A?cpy(a); cout<<"orign:"<<a.str<<','<<a.score<<endl; cout<<"copy:"<<cpy.str<<','<<cpy.score<<endl; A?assigned; assigned?=?a; cout<<"assigned:"<<assigned.str<<','<<assigned.score<<endl; cout<<"a<b?"<<(a<b?"true":"false")<<endl; s.insert(a); s.insert(b); s.insert(c); cout<<"size:"<<s.size()<<endl; } int?main()?{ ????test(); ????return?0; } |
編譯可通過,輸出為:
orign:shanying,100
copy:shanying,100
assigned:shanying,100
a<b?false
size:3
總結
- 上一篇: hdu 1392 Surround th
- 下一篇: hdu 4150 Powerful I