C++ STL中map关联容器的用法

话不多说,直接上代码。
程序运行截图
在这里插入图片描述


#include <iostream>
#include <map>
#include <unordered_map>//Hashmap 不进行 键排序的map。
#include <string>
using namespace std;

//Hash映射
//map 关联容器,提供一对一的哈希映射key-value key和value的类型可以是任意类型。key关键字,value关键字对应的值。
//底层实现是维护一颗红黑树,具有自动排序的功能。查找O(H),H是树的高度。
//红黑树的高度H<=log_2 N N是树的节点个数。
int main()
{
	map<int, string>m;
	//unordered_map<int, string>um;

	/*
	map<string, int>mm;
	//初始状态下
	mm["str"]==0;true
	*/

	//添加键值对 
	m.insert(pair<int, string>(1, "A"));//插入pair
	m.insert(map<int, string>::value_type(2, "B"));//插入value_type的数据。
	//使用insert方式,如果键值已经存在,则不进行插入操作。并返会pair,pair.second=false;

	m[2] = "B";//使用数组进行赋值。如果键值已经存在,则进行覆盖
	m[1] = "A";

	//m.insert(map<int, string>::value_type(003, "liuqiang"))返回类型是pair<iterator,bool> 
	pair< map<int, string>::iterator, bool>p = m.insert(map<int, string>::value_type(3, "C"));
	cout << "是否插入成功:"  <<p.second/*1代表成功*/<<" "<<p.first->second<<endl;
	
	//查找元素
	map<int, string>::const_iterator iter;
	iter = m.find(1);
	if (iter != m.end())cout << "找到了键值:" <<iter->first<<"  "<<iter->second << endl;

	//删除键值对
	map<int, string>::iterator ReturnIt;
	if (iter != m.end())ReturnIt = m.erase(iter);//用迭代器删除
	//erasr返回的迭代器指向的iter的下一个迭代器
	if (ReturnIt != m.end()) 
	{
		cout << "ReturnIt有效" << endl;
		cout << "erasr(iterator)返回的迭代器指向的iter的下一个迭代器:" << ReturnIt->second << endl;
	}

#if 0
	int n = m.erase(2);//用键值删除。删除成功返回0 。否则返回1。
	m.erase(m.begin(), m.end());//用迭代器区间删除。

	删除所有元素
	m.clear();//无返回值
#endif



	cout << "关联容器中现有键值对数量:"<<m.size() << endl;
	//m.empty();//空返回true 非空返回false
	cout << "关联容器中能容纳键值对的数量:" << m.max_size() << endl;

	//返回指定元素出现的次数。
	//m.count();

	m[1] = "A";
	m[2] = "B";
	m[3] = "C";
	m[4] = "D";
	//遍历。从前往后遍历
	cout <<endl<< "遍历。从前往后遍历" << endl;
	for (iter = m.begin(); iter != m.end(); ++iter)
	{
		cout << "键:" << iter->first << "  " << "值:" << iter->second << endl;
	}

	//遍历。从后往前遍历
	//rbegin()返回指向map尾部的逆向迭代器,用于反向可变序列的开头
	//rend()返回指向map头部的逆向迭代器。
	//注:访问迭代器end()是越界的,但是访问rbegin()没有越界。因为rbegin()是end()迭代器前一个迭代器
	cout <<endl<< "遍历。从后往前遍历" << endl;
	map<int, string>::reverse_iterator ReverseIter;
	for (ReverseIter = m.rbegin(); ReverseIter != m.rend(); ++ReverseIter)
	{
		cout << "键:" << ReverseIter->first << "  " << "值:" << ReverseIter->second << endl;
	}

	//返回特殊条目的迭代器对
	//返回值分两种类型
	// _Pairii = pair<iterator, iterator>;
	// _Paircc = pair<const_iterator, const_iterator>;
	cout <<endl<< "equal_range(const _Other& _Keyval)用法" << endl;
	//m.equal_range(3);//1   equal_range(const _Other& _Keyval)返回值_Pairii或_Paircc
	pair< map<int, string>::const_iterator, map<int, string>::const_iterator>constEQpair= m.equal_range(3/*key*/);
	//constEQpair.first是代表key所在的迭代器。未找到则不能访问该迭代器,constEQpair.second自然也不不能访问
	//constEQpair.second是代表key所在的迭代器的下一个迭代器。注意是否可访问
	cout << constEQpair.first->first<<"  "<< constEQpair.first->second << endl;//返回key和value
	cout << constEQpair.second->first << "  " << constEQpair.second->second << endl;
	


	//m.get_allocator();//返回迭代器适配器





	//m.key_comp();//返回比较key的函数
	cout << endl << "key_comp();//返回比较key的函数" << endl;
	int End = m.rbegin()->first;
	//cout << "End=" << End << endl;//4
	map<int,string>::key_compare KeyCompare = m.key_comp();
	map<int, string>::iterator BeginIter = m.begin();
	do
	{
		cout << "键:"<<BeginIter->first<<"  "<< "值"<<BeginIter->second  << endl;
	} while (KeyCompare((*BeginIter++).first, End));


	//m.value_comp();//返回比较元素value的函数
	//cout << endl << "value_comp();//返回比较value的函数" << endl;
	//string strEnd = m.rbegin()->second;
	cout << "strEnd=" << strEnd << endl;//D
	//map<int, string>::value_compare ValCompare = m.value_comp();
	//map<int, string>::iterator ValBeginIter = m.begin();
	//do
	//{
	//	cout << "键:" << BeginIter->first << "  " << "值" << BeginIter->second << endl;
	//} while (ValCompare((*ValBeginIter++).second,strEnd));//这行有问题


	cout << endl << "lower_bound(2)" << endl;
	map<int,string>::iterator LowB=m.lower_bound(2);//返回≥给定元素的第一个位置的迭代器
	for (LowB; LowB != m.end(); ++LowB)
	{
		cout << "键:" << LowB->first << "  " << "值:" << LowB->second << endl;
	}
	//m.upper_bound(3);


    return 0;
}

/*

iterator erase(const_iterator _First, const_iterator _Last)
		{	// erase [_First, _Last)
		if (_First == begin() && _Last == end())
			{	// erase all
			clear();
			return (begin());
			}
		else
			{	// partial erase, one at a time
			while (_First != _Last)
				erase(_First++);
			return (iterator(_First._Ptr, _STD addressof(this->_Get_data())));
			}
		}

*/

猜你喜欢

转载自blog.csdn.net/weixin_43246859/article/details/105712046