C++ Maps

本文深入讲解了C++标准库中的Maps容器,包括18种常用操作的语法和功能,如begin、end、clear、find、insert等,以及equal_range、key_comp、value_comp等高级功能的使用方法和示例。

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

C++ Maps 被用作储存“关键字/值”对

常见的操作如下:

1、begin

语法:

  iterator begin();

begin()函数返回一个迭代器指向map的第一个元素。

2、clear

语法:

  void clear();

clear()函数删除map中的所有元素。

3、count

语法:

  size_type count( const KEY_TYPE &key );

count()函数返回map中键值等于key的元素的个数。

4、empty

语法:

  bool empty();

empty()函数返回真(true)如果map为空,否则返回假(false)。

5、end

语法:

  iterator end();

end()函数返回一个迭代器指向map的尾部。

equal_range是C++ STL中的一种二分查找的算法,试图在已排序的[first,last)中寻找value,它返回一对迭代器i和j,其中i是在不破坏次序的前提下,value可插入的第一个位置(亦即lower_bound),j则是在不破坏次序的前提下,value可插入的最后一个位置(亦即upper_bound),因此,[i,j)内的每个元素都等同于value,而且[i,j)是[first,last)之中符合此一性质的最大子区间

   如果以稍许不同的角度来思考equal_range,我们可把它想成是[first,last)内"与value等同"之所有元素形成的区间A,由于[fist,last)有序(sorted),所以我们知道"与value等同"之所有元素一定都相邻,于是,算法lower_bound返回区间A的第一个迭代器,算法upper_bound返回区间A的最后一个元素的下一个位置,算法equal_range则是以pair的形式将两者都返回

   即使[fist,last)并未含有"与value等同"之任何元素,以上叙述仍然合理,这种情况下,"与value等同"之所有元素形成的,其实是一个空区间,在不破坏次序的情况下,只有一个位置可以插入value,而equal_range所返回的pair,其第一和第二(都是迭代器)皆指向该位置。

// map::equal_elements
#include <iostream>
#include <map>
using namespace std;

int main ()
{
  map<char,int> mymap;
  pair<map<char,int>::iterator,map<char,int>::iterator> ret;

  mymap['a']=10;
  mymap['b']=20;
  mymap['c']=30;

  ret = mymap.equal_range('b');

  cout << "lower bound points to: ";
  cout << ret.first->first << " => " << ret.first->second << endl;

  cout << "upper bound points to: ";
  cout << ret.second->first << " => " << ret.second->second << endl;

  return 0;
}

6、erase

语法:

  void erase( iterator pos );
  void erase( iterator start, iterator end );
  size_type erase( const KEY_TYPE &key );

erase()函数删除在pos位置的元素,或者删除在start和end之间的元素,或者删除那些值为key的所有元素。

7、find

语法:

  iterator find( const KEY_TYPE &key );

find()函数返回一个迭代器指向键值为key的元素,如果没找到就返回指向map尾部的迭代器

8、get_allocator

语法:

  allocator_type get_allocator();

get_allocator()函数返回map的配置器。

9、insert

语法:

  iterator insert( iterator pos, const pair<KEY_TYPE,VALUE_TYPE> &val );
  void insert( input_iterator start, input_iterator end );
  pair<iterator, bool> insert( const pair<KEY_TYPE,VALUE_TYPE> &val );

insert()函数:

 

  • 插入val到pos的后面,然后返回一个指向这个元素的迭代器
  • 插入start到end的元素到map中。
  • 只有在val不存在时插入val。返回值是一个指向被插入元素的迭代器和一个描述是否插入的bool值。

10、key_comp

语法:

  key_compare key_comp();

key_comp()函数返回一个比较key的函数。

11、lower_bound

语法:

  iterator lower_bound( const KEY_TYPE &key );

lower_bound()函数返回一个迭代器,指向map中键值>=key的第一个元素。

12、max_size

语法:

  size_type max_size();

max_size()函数返回map能够保存的最大元素个数。

13、rbegin

语法:

  reverse_iterator rbegin();

rbegin()函数返回一个指向map尾部的逆向迭代器

14、rend

语法:

  reverse_iterator rend();

rend()函数返回一个指向map头部的逆向迭代器

15、size

语法:

  size_type size();

size()函数返回map中保存的元素个数。

16、swap

语法:

  void swap( map &obj );

swap()交换obj和现map中的元素。

17、upper_bound

语法:

  iterator upper_bound( const KEY_TYPE &key );

upper_bound()函数返回一个迭代器,指向map中键值>key的第一个元素。

18、value_comp

语法:

  value_compare value_comp();

value_comp()函数返回一个比较元素value的函数。

关于key_comp与value_comp的用法如下:

    这两东西就是用来比较两个值是否相等的函数或者仿函数,用在带排序功能的容器里,比如map和set。
    比如set<XXX>,如果类型XXX支持operator <,那么默认会用<号作为比较的依据。如果类型XXX不支持<号,那么你可以自己提供一个函数或者仿函数实现比较功能,并作为set的模板参数,比如:set<XXX, MyComp>。
    key_comp用来比较key大小,value_comp用来比较value大小。
    对set来说,key和value是一回事,两个东西等价。
    对map来说,比如map<XXX, YYY>,key的类型是XXX,value的类型是pair<XXX, YYY>。key_comp就是用来比较XXX类型的值的东西,value_comp就是用来比较pair<XXX,YYY>的东西。但是value_comp的比较方式跟key_comp是一样的。pair<XXX, YYY>里只有XXX会被比较,YYY不参与比较。

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值