话不多说,直接上代码。
程序运行截图
#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())));
}
}
*/