map自定义结构体当键值

目录

1、map自定义键值注意事项

2、例题

2.1、题目

2.2、代码


1、map自定义键值注意事项

在自定义结构体中重载operator<()操作符

class package
{
public:
	string src_ip;
	int src_port;
	string des_ip;
	int des_port;
    //初始化
	package(string src_ip, int src_port, string des_ip, int des_port) :
		src_ip(src_ip), src_port(src_port), des_ip(des_ip), des_port(des_port)
	{};
    //重载 operator<
	bool operator<(const package &pkg) const //注意这里的两个const
	{
		if (src_ip < pkg.src_ip || (src_ip == pkg.src_ip && src_port < pkg.src_port)
			||(src_ip == pkg.src_ip && src_port == pkg.src_port && des_ip < pkg.des_ip)     
            ||(src_ip == pkg.src_ip && src_port == pkg.src_port && des_ip == pkg.des_ip     
              && des_port < pkg.des_port))
		{
			return true;
		}
		else
		{
			return false;
		}
	}
		
};

2、例题

2.1、题目

2.2、代码

int main()
{
	int n;
	cin >> n;
	vector<package>packages;
	map<package, int>mp;
	vector<int>res;

	for (int i = 0; i < n; i++)
	{
		string src_ip, des_ip;
		int src_port, des_port;
		cin >> src_ip >> src_port >> des_ip >> des_port;
		package tmp(src_ip, src_port, des_ip, des_port);

		packages.push_back(tmp);
	}

	for (int i = 0; i < n; i++)
	{
		auto it = mp.find(packages[i]);
		
		if (it == mp.end()) //插入
		{
			int index = mp.size() + 1;
			mp[packages[i]] = index;
		}
	
		res.push_back(mp[packages[i]]);
	}
	for (int i = 0; i < n; i++)
	{
		cout << res[i] << endl;
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_33457548/article/details/104869717