「C++」STL —— Map

本文详细介绍了C++ STL中的Map容器,包括Map的简介、使用、成员函数,如构造函数、赋值操作、迭代器、容量、元素访问、修改、观察者和操作。Map是一个有序无重复的关联容器,内部实现为红黑树,提供了快速插入、删除和查找功能。文章还详细讨论了Map的各种构造、赋值、插入、删除、查找等操作的用法和示例。
摘要由CSDN通过智能技术生成

Map用到了就顺便学习总结一下。

1. Map的简介

MapSTL的一种有序无重复的关联容器,它提供 < Key - Value > 形式的数据处理能力,其内部自建一颗非严格意义上的平衡二叉树,这颗树具有按 Key 值对数据自动排序的功能,所以在 Map 内部所有的数据都是有序的。其可以实现对 < Key - Value > 数据的快速插入、删除、查找和遍历等操作。Map 可以根据 Key 值快速查找对应的 Value 值。且对于迭代器而言,增加和删除节点对迭代器的影响很小,且在迭代中不可修改 Key 值。

template < class Key,                                     // map::key_type
           class T,                                       // map::mapped_type
           class Compare = less<Key>,                     // map::key_compare
           class Alloc = allocator<pair<const Key,T> >    // map::allocator_type
           > class map;

模板参数的第三个 class Compare = less< Key> 是一种比较函数,通过这个比较函数,map能比较两个不同的 key值的大小关系。默认采用 less< Key>, 即 Key 类型的 "<“操作符。如果 Key类型没有”<"操作符的定义,则需要提供一个自定义比较函数的函数指针,来作为Compare函数。

2. Map的使用

使用 Map 只需要在源代码文件中包含其对应的头文件即可,STL头文件没有扩展名.h

#include <map>

由于map的对象是模版类,所以<>中的模版参数必须进行指定,例如:

using std::map;
using std::string;
map<string,int>  maps2i;

在上面的例子中,key 值为 string 类型,而 value 值为 int 类型,在使用中 keyvalue 可以指定为任意类型。由于键和映射值的类型可能有所不同,所以map类以成员类型value_type将其分组在一起,成员类型value_type是将两者结合的成对类型:

typedef pair<const Key, T> value_type;

3. Map成员函数 ( Member functions )

3.1 构造函数 ( Constructor )

C++11中包含了五种构造函数:

  • 默认构造函数:构造一个空的map对象,没有元素。
  • 范围构造函数:将指定范围内 [first,last)的元素按对应次序填入map变量中。
  • 拷贝构造函数:用另一个同类对象构造当前对象。
  • 移动构造函数:和分配器一起移动,构造一个获取元素X的容器。如果分配器被指定并且与X的分配器不同,则元素被移动。 否则,将不会构造任何元素(其所有权将直接转让)。X处于未指定但有效的状态。
  • 初始化列表构造函数:通过列表中的每一个元素构造当前对象。

以下代码为常用构造函数的举例说明:

// constructing maps
#include <iostream>
#include <map>

bool fncomp (char lhs, char rhs) {
   return lhs<rhs;}

struct classcomp {
   
  bool operator() (const char& lhs, const char& rhs) const
  {
   return lhs<rhs;}
};

int main ()
{
   
  std::map<char,int> first;  // 1. 默认构造函数

  first['a']=10;             // 对first赋予Key和Value值
  first['b']=30;
  first['c']=50;
  first['d']=70;

  std::map<char,int> second (first.begin(),first.end()); // 2. 范围构造函数

  std::map<char,int> third (second);                     // 3. 拷贝构造函数

  std::map<char,int,classcomp> fourth;                   // class as Compare

  bool(*fn_pt)(char,char) = fncomp;
  
  std::map<char,int,bool(*)(char,char)> fifth (fn_pt);   // function pointer as Compare

  //map<key, value> m(initializer_list<value_type> il)   // 5. 列表初始化,value_type是pair类型,所以要构造成pair作为列表
  map<key, value> m{
   {
   key k1, value v1},{
   k2, v2}, ...}  // 通过 {}构造 pair
 map<key, value> m{
   make_pair(key k1, value v1), make_pair(k2, v2), ...}  // 通过 make_pair() 函数构造 pair
 map<key, value> m{
   pair<key, value>(k1, v1), pair<key, value>(k2, v2), ...}  // 通过类型转换构造 pair

  return 0;
}

3.2 赋值操作

copy (1): map& operator= (const map& x);
move (2): map& operator= (map&& x);     // 这个不是太明白还
initializer list (3) : map& operator= (initializer_list<value_type> il);

以下代码说明一下拷贝赋值与列表赋值:

// assignment operator with maps
#include <iostream>
#include <map>

int main ()
{
   
  std::map<char,int> first = {
   {
   'x'8},{
   'y'16},{
   'z'32}}; // 列表赋值
  std::map<char,int> second;

  second=first;                // second now contains 3 ints 拷贝赋值
  first=std::map<char,int>();  // and first is now empty

  std::cout << "Size of first: " << first.size() << '\n';
  std::cout << "Size of second: " << second.size() << '\n';
  return 0;
}

3.3 迭代器 ( Iterators )

迭代器有四组用法,如下所示:
迭代器的用法
对应的代码可以参考以下代码:

// map::begin/end
#include <iostream>
#include <map>

int main ()
{
   
  std::map<char,int> mymap;
  mymap['b'] = 100;
  mymap['a'] = 200;
  mymap['c'] = 300;

  // show content:
  for (std::map<char,int>::iterator it=mymap.begin(); it!=mymap.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值