STL总结之map

本文详细介绍了C++ STL中的map容器,包括其作为红黑树的数据结构特性,如何初始化、修改、查询、增加和删除元素,以及各种操作方法的使用示例,帮助读者深入理解map的使用。

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

介绍

map 是一个封装红黑树 (自平衡二叉树) 的关联容器。容器中每个元素都是 key/value,其中 key 为排序对象。每个 key 只能出现一次,不允许重复出现。
map 定义于头文件 <map> 中,其声明如下:

template<
    class Key,
    class T,
    class Compare = std::less<Key>,
    class Allocator = std::allocator<std::pair<const Key, T> >
> class map;

map 容器是一个类。
map 容器存储元素都是 key/value (键值对)。

初始化

map 容器需要指定排序规则,有两种方式可指定:

  • 元素类型重载小于号运算符。
    strcut T {
    	…… // 各种参数
    	// 该函数声明必须这样写
    	friend bool operator <(const T& a,const T& b)
    	{
    		// check(a,b)为 a < b 成立条件
    		return check(a,b) ? true : false;
    	}
     };
    
  • 以 类型参数 定义,需要定义一个 函数对象。如 set<T,greater<T> >
    struct Cmp {
    	bool operator()(const T& a,const T& b)
    	{	
    	    // check(a,b)为 a < b 成立条件
    		return check(a,b) ? true : false;
    	}
    };
    
    class Cmp {
    public:
    	bool operator()(const T& a,const T& b)
    	{	
    	    // check(a,b)为 a < b 成立条件
    		return check(a,b) ? true : false;
    	}
    };
    
    // 这两个 Cmp 是等价的
    map<int,int,Cmp> s;
    

以下构造函数都不涉及定义排序规则,均采用默认排序规则——升序。

  • map<T,T> mp;
    创建一个空的 map 容器。
    map<int,string> mp;
    
  • map<T,T> mp({{num1.key,num1.value},{num2.key,num2.value},……});
    创建一个以初值列元素为初值的 map 容器。
    map<int,string> mp({{0,"zero"},{1,"one"}});
    
  • map<T,T> mp = {{num1.key,num1.value},{num2.key,num2.value},……};
    创建一个以初值列元素为初值的 map 容器。
    map<int,string> mp = {{0,"zero"},{1,"one"}};
    
  • map<T,T> mp(mp1);
    创建一个 mp1 的同型拷贝 (所有元素都被复制)。
    map<int,string> mp1 = {{0,"zero"},{1,"one"}};
    map<int,string> mp(mp1);
    
  • map<T,T> mp = mp1;
    创建一个 mp1 的同型拷贝 (所有元素都被复制)。
    map<int,string> mp1 = {{0,"zero"},{1,"one"}};
    map<int,string> mp = mp1;
    
  • map<T,T> mp(begin_iterator,end_iterator);
    创建一个以迭代器区间为 [begin_iterator,end_iterator) 作为元素初值的 map 容器。
    map<int,string> mp1 = {{0,"zero"},{1,"one"}};
    map<int,string> mp(mp1.begin(),mp1.end());
    

修改

map 容器禁止修改元素内容。
由于 map 容器元素内容为 key/value ,因此 map 容器提供了根据 key 获取 value的方法。

  • at(key)
    返回键值 key 对应的 value 的引用。如果不存在,则返回 std::out_of_range
  • operator[key]
    返回键值 key 对应的 value 的引用。如果不存在,则插入该键值对。
  • 迭代器
    这种方法需要遍历 map 容器。
    迭代器指向的是 map 容器中的元素,欲获取其中的键和值,需如下使用:
    map<int,string>::iterator ite = mp.begin();
    cout << "键:"  << (*ite).first << endl;
    cout << "值:" << (*ite).second << endl;
    

查询

  • empty()
    判断 map 容器是否为空。
  • size()
    返回 map 容器中的元素个数。
  • max_size()
    返回 map 容器大小的理论极限值,即当前内存情况下,允许创建 map 容器中元素个数的最大可能值。
  • count(key)
    返回 map 容器中键值为 key 的元素个数。
  • find(key)
    判断 map 容器中是否存在键值为 key 的元素,存在返回相应迭代器,否则返回 end()

比较

按照字典序列比较 map 中的值。

  • operator ==
  • operator !=
  • operator <
  • operator <=
  • operator >
  • operator >=
if(mp == mp1)
{
	cout << "mp == mp1" << endl;
}

增加

增加元素,需要传递键值对。在 map 容器中,通常构造 pair<> 进行传递。

  • operator[]
    这是一种特殊的添加元素方法,而且也是平时使用次数比较多的方法。
    map<int,string> mp;
    mp[0] = "zero";
    mp[1] = "one";
    
  • insert(pair<T,T>())
    map 容器中插入一个元素。
    其返回值为 pair<map<T,T>::iterator,bool>map<T,T>::iterator 指向插入元素位置的迭代器,bool 表示插入是否成功 (如果容器中存在该值,则会插入不成功)。
    insert(pair<int,string>(5,"five"));
    
  • insert(begin_iterator,end_iterator)
    map 容器中迭代器区间 [start_iterator,end_iterator) 内的所有元素,元素可能插入不成功。无返回值。
    map<int,string> mp1 = {{0,"zero"},{1,"one"}};
    map<int,string> mp = {{0,"hhh"}};
    mp.insert(mp1.begin(),mp1.end());
    // 此时 mp 容器元素依次为:{0,,"hhh"},{1,"one"}
    // mp1 中第一个元素插入失败,第二个元素插入成功 
    

删除

  • clear()
    清空 map 容器。
  • erase(pos_iterator)
    移除 map 容器指定迭代器位置 pos_iterator 的元素。
    map<int,string> mp = {{0,"zero"},{1,"one"}};
    mp.erase(mp.begin());
    // 此时 map 容器元素依次为:{0,"zero"}
    
  • erase(begin_iterator,end_iterator)
    移除 map 容器指定迭代器位区间 [begin_iterator,end_iterator) 中的所有元素。
    map<int,string> mp = {{0,"zero"},{1,"one"}};
    mp.erase(mp.begin(),++mp.begin());
    // 此时 map 容器元素依次为:{0,"zero"}
    
  • erase(key)
    移除 map 容器中键值为 key 的元素 (如果存在的话)。返回值表示移除元素个数。

其他操作

  • equal_range(key)
    返回键值等于 key 的迭代器区间。
    其返回值为 pair<map<T,T>::iterator,map<T,T>::iterator>map<T,T>::iterator指向第一个元素键值等于 key 的迭代器位置,第二个map<T,T>::iterator 指向最后一个元素键值等于 key 迭代器位置的下一个位置。
    map<int,string> mp = {{0,"zero"},{1,"one"}};
    pair<map<int,string>::iterator,map<int,string>::iterator> result = mp.equal_range(0);
    
  • lower_bound(key) / upper_bound(key)
    返回首个元素值 ≥key\ge keykey 的元素迭代器位置。
    返回首个元素值 &gt;key&gt; key>key 的元素迭代器位置。
    两者返回值刚好构成 equal_range() 的返回值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值