下面程序的输出结果是什么?为什么?
#include <iostream> #include <vector> #include <set> using namespace std; struct node { char ch; int cost; node() { ch = '\0'; cost = 0; } //把这个函数注释了,对整个程序没有任何影响 bool operator == ( const node &rhs) const { return rhs.ch == ch; } //如果把这个程序注释了,将会出现一堆的错误,有关STL中的错误,是无法调试、无法修改的 bool operator < (const node &rhs) const { return rhs.cost > cost; } }; int main(int argc, char* argv[]) { node a, b; multiset<node> ms; ms.insert(a); ms.insert(b); set<node> s; s.insert(a); s.insert(b); cout <<"ms.size() = " << ms.size() << "\ns.size() = " << s.size() << endl; // 虽然我们重定义了==函数,但这是无用的,set只根据< 符号来做判断 ms.clear(); s.clear(); a.ch = 'A'; b.ch = 'B'; s.insert(a); s.insert(b); ms.insert(a); ms.insert(b); cout <<"ms.size() = " << ms.size() << "\ns.size() = " << s.size() << endl; ms.clear(); s.clear(); a.ch = 'A'; b.ch = 'A'; a.cost = 2; b.cost = 1; s.insert(a); s.insert(b); ms.insert(a); ms.insert(b); cout <<"ms.size() = " << ms.size() << "\ns.size() = " << s.size() << endl; // 可以看到,set内部根据cost排序了 cout <<"(*(s.begin())).cost = " << ( *(s.begin())).cost << endl; return 0; }
测试结果: