C++ 如何使用结构体作为map的key


#include <iostream>
#include <string>
#include <map>

using namespace std;

struct StructTest
{
	std::string str1;
	std::string str2;
	double diameter;
	double length;

	StructTest() : str1(""), str2(""), diameter(0.), length(0.) {}

	StructTest(const std::string& str1, const std::string& str2, double diameter,
		double length)
		: str1(str1), str2(str1), diameter(diameter), length(length)
	{
	}

	bool operator = (const StructTest& c) const
	{
		if (!str1.compare(c.str1) && !str2.compare(c.str2) &&  abs(diameter - c.diameter) < 0.0001
			&& abs(length - c.length) < 0.0001)
		{
			return true;
		}
		return false;
	}


	bool operator < (const StructTest& c) const
	{
		if (str1 < c.str1)
		{
			return str1 < c.str1;
		}
		else if (str1 == c.str1 && str2 < c.str2)
		{
			return str2 < c.str2;
		}
		else if (str1 == c.str1 && str2 == c.str2 && diameter < c.diameter)
		{
			return diameter < c.diameter;
		}
		else if (str1 == c.str1 && str2 == c.str2 && abs(diameter - c.diameter) < EPS  && length < c.length)
		{
			return length < c.length;
		}
		return false;
	}
};

int main()
{
	map<StructTest, int> test1;
	StructTest tag;
	tag.str1 = "chen";
	tag.str2 = "111"; 
	tag.diameter = 1;
	tag.length = 100;

	test1.insert(make_pair(tag, 22));

	std::cout << "find new one\n";
	StructTest key;
	if (test1.find(key) == test1.end())
	{
		std::cout << "not find\n";
	}
	else
	{
		std::cout << "find\n";
	}

	std::cout << "\nfind itself \n";
	if (test1.find(tag) == test1.end())
	{
		std::cout << "not find\n";
	}
	else
	{
		std::cout << "find\n";
	}

	getchar();

	return 0;
	
}

输出

之前也没有使用map做过类似的功能,调BUG的过程中发现,如果在结构体中没有写 < 的重载,直接使用map的find会有问题。

当然这个和map本身的结构有关

需要注意的是如果结构体包含多个成员,在重载运算符的时候需要对每个成员都要进行比较;

注意: 多个数据的比较

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值