C++-STL(9)-unordered_map-自定义类型(2)key-自定义对象指针-实例源码

本文深入探讨了C++ STL中的unordered_map容器如何处理自定义对象作为键值,特别是当键值为自定义对象指针时的实现细节。文章通过具体代码示例,讲解了如何重载运算符和哈希函数,以及在插入、查找和删除操作中的注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

C++-STL(8)-unordered_map讲的自定义对象中的成员变量基础数据类型。
本篇实现的是成员变量自定义对象 key值自定义对象指针。
注意点:1.创建:重载=,重载<,重载 哈希函数
               2.删除时 要delete 和置空。
上代码:

 

class nodemap {
public:
	int m_value;        //基础数据类型
	nodemap* next;      //自定义对象指针

	nodemap(int val)
	{
		m_value = val;
		next = NULL;
	}
	bool operator < (const nodemap& n) const    //重载<
	{
		return m_value < n.m_value;
	}
	bool operator==(const nodemap& rc) const      //重载=
	{ 
		return m_value == rc.m_value && next == rc.next;
	}
	size_t operator()(const nodemap& rc)const              //重载hash
	{
		return hash<int>()(rc.m_value) ^ hash<nodemap*>()(rc.next);

	}
	
};
void unorderedmap_main()
{
	cout<<"**unorderedmap_main*************"<<endl;
	cout << "新建*************" << endl;
//	hashtest();
	//hash<int> hash_int;
//	unordered_map <nodemap*, int, nodemap_hash> mp;
	unordered_map <nodemap*, int> mp;
	nodemap* findnode = NULL;
	nodemap* deletenode = NULL;
	for (int i = 0; i < 5; i++)
	{
		nodemap* node = new nodemap(i);
		mp.insert(make_pair(node, i));
		if (i == 2) { findnode = node; }
		if (i == 3) { deletenode = node; }
	}
	for (auto iter = mp.begin(); iter != mp.end(); ++iter)
	{
		cout << "node.frist.m_value=" << iter->first->m_value << endl;
	}
		
	
    unordered_map <nodemap*, int>::iterator it;
	for (it = mp.begin(); it != mp.end(); it++)
	{
		if (it->first != nullptr)
		{
			cout << it->first->m_value << ",,second=" << it->second << endl;
		}
	}
	cout << "查找 2*************" << endl;

	auto findit = mp.find(findnode);
	cout << findit->first->m_value << "***" << findit->second << endl;
	cout << "删除 3 后*************" << endl;
	for (auto iter = mp.begin(); iter != mp.end(); ++iter)
	{
		auto first = iter->first;
		if (first->m_value == 3)
		{
			delete first;				  // 释放指针
			first = NULL;
			mp.erase(iter++);
		}
	}
	for (it = mp.begin(); it != mp.end(); it++)
	{
		if (it->first != nullptr)
		{
			cout << it->first->m_value <<"***"<< it->second << endl;
		}
	}
	cout << "释放*************" << endl;
	for (auto iter = mp.begin(); iter != mp.end(); )
	{
		auto first = iter->first;
		if (first)
		{
			delete first;				  // 释放指针
			first = NULL;
			mp.erase(iter++);	         // 从map中删除元素,注意iter++的写法
		}
	}
	mp.clear();
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值