unordered_map 自定义结构为Key

有如下结构体

struct Word {
	int len = 0;
	int ascii = 0;
	Word(string str)
	{
		len = str.length();
		for (char c : str)
		{
			ascii += c;
		}
	}
};

需要使用如下场景

unordered_map<Word, vector<string>>m;

这里需要实现哈希函数和重载()函数

struct Hash
{
	std::size_t operator()(const Word& word) const
	{
		using std::size_t;
		using std::hash;

		return ((hash<int>()(word.len)
			^ (hash<int>()(word.ascii) << 1)) >> 1);
	}
};

struct Equal
{
	bool operator () (const Word& lhs, const Word& rhs) const
	{
		return lhs.len == rhs.len
			&& lhs.ascii == rhs.ascii;
	}
};

然后就可以使用ordered_map了

unordered_map<Word, vector<string>, Hash, Equal> m;
		vector<vector<string>> ret;
		for (auto& str : strs)
		{
			Word w(str);
			auto iter = m.find(w);
			if (iter == m.end())
			{
				vector<string> v;
				v.push_back(str);
				m.insert(pair<Word, vector<string>>(w, v));
			}
			else
			{
				iter->second.push_back(str);
			}
		}

		for (auto it = m.begin(); it != m.end(); it++)
		{
			ret.push_back(it->second);
		}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

顾文繁

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值