STL的set容器如何存放结构体?根据什么排序?

时间:2022-09-03 19:06:44

下面程序的输出结果是什么?为什么?

#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;
}

测试结果:

STL的set容器如何存放结构体?根据什么排序?