C++-STL(8)-unordered_map-自定义类型(1)-key-自定义对象-实例源码

本篇 自定义对象:Rect里的成员变量都是基础数据类型。
下篇  C++-STL(9)-unordered_map-自定义类型(2)-实例源码 成员变量是自定义对象
基础数据类型、自定义对象类型相比:
  1.定义:unordered_map<Rect, Rect_hash,int> rectmap;
                unordered_map<string,int> imap;
   2.访问:
              unordered_map<Rect, Rect_hash,int>::iterator iter;   iter->first.name
              unordered_map<string,int>::iterator iter;                        iter->first

以下是unordered_map 自定义类型增删改查代码实例:
1.class Rect{};

class Rect {
public:
	int width;
	int height;
	string name;


	Rect(int a, int b, string str)
	{
		width = a;
		height = b;
		name = str;
	}
	bool operator==(const Rect& rc) const
	{
		return name == rc.name && width == rc.width && height==rc.height;
	}

};


2.class Rect_hash{};
 

class Rect_hash
{
public:
	size_t operator()(const Rect& rc)const
	{
		return hash<string>()(rc.name) ^ hash<int>()(rc.width) ^ hash<int>()(rc.height);
	}
	
};


3.hashmap_rect()调用

void hashmap_rect()
{
	cout << "hashmap_rect*******************" << endl;
	//1.定义 unordered_map < Rect,int,Rect_hash> rectmap;
	//2.插入insert pair<,> make_pair(Rect(0, 300, "a"), 300));
	//3.得到大小 int nSize = rectmap.size();
	//4.查找 iter=rectmap.find()   输入key 返回iter
	//5.删除 int n=rectmap.erase(key) 返1 成功;返0 不成功
	//6.删除全部 rectmap.erase(rectmap.begin(), rectmap.end());
	//7.修改rectmap['d']=4000;
	
	cout << "1定义 unordered_map<Rect, Rect_hash,int> rectmap;" << endl;
	cout << " 2插入insert pair<,>" << endl;
	unordered_map <Rect, int,Rect_hash> rectmap;
	rectmap.insert(make_pair(Rect(0, 300, "a"), 300));
	rectmap.insert(pair<Rect, int>(Rect(1, 200, "z"), 200));
	rectmap.insert(pair<Rect, int>(Rect(2, 300, "b"), 300));
	rectmap.insert(pair<Rect, int>(Rect(3, 7, "d"), 7));
	rectmap.insert(pair<Rect, int>(Rect(4, 500, "f"), 500));
	for (auto iter = rectmap.begin(); iter != rectmap.end(); ++iter)
	{
		cout << "first.name=" << iter->first.name << "first.width=" << iter->first.width << "first.heigh=" << iter->first.height << endl;
	}
	cout << " 3得到大小 int nSize = rectmap.size();" << endl;
	int nSize = rectmap.size();
	cout << nSize << endl;
	cout << "4.查找 iter=rectmap.find(b)  输入key 返回iter Rect rect1 = Rect(2, 300, 'b'); " << endl;
	unordered_map<Rect, int, Rect_hash>::iterator iter;
	Rect rect1 = Rect(2, 300, "b");
	iter = rectmap.find(rect1);
	cout << "first.name=" << iter->first.name << "first.width=" << iter->first.width << "first.heigh=" << iter->first.height << endl;

	cout << "5.删除 int n=rectmap.erase(key) 返1 成功;返0 不成功  iter Rect rect2 = Rect(1, 200, 'z')" << endl;
	Rect rect2 = Rect(1, 200, "z");
	int n = rectmap.erase(rect2);
	cout << "删除后的返回值=" << n << endl;
	for (iter = rectmap.begin(); iter != rectmap.end(); iter++)
	{
		cout << "first.name=" << iter->first.name << "first.width=" << iter->first.width << "first.heigh=" << iter->first.height << endl;
	}
	cout << "6.修改rectmap[rect1]=4000;  rect1 = Rect(2, 300, 'b')" << endl;
	rectmap[rect1] = 4000;
	cout << rectmap[rect1] << endl;

	cout << "7.删除全部 rectmap.erase(rectmap.begin(), rectmap.end());" << endl;
	rectmap.erase(rectmap.begin(), rectmap.end());
	nSize = rectmap.size();
	cout << "删除全部后map的长度" << nSize << endl;
		
}



      
   
      

posted @ 2020-02-07 06:59  jasmineTang  阅读(351)  评论(0)    收藏  举报