【STL】 map

来源:互联网 发布:超级优化基因液 编辑:程序博客网 时间:2024/06/01 07:39

概述

Map可以插入键值对,并根据键值自动将所有的元素进行排序,根据键值进行元素的检索与删除。

使用

1. 头文件

头文件:

#include <map>

2. 常用构造函数

map<int,string> m1;            //创建一个空的mapmap<int,string,cmp> m2;          //创建一个自定义排列顺序的mapmap<int,string> m3(m2);          //创建一个copy对象m2生成的mapmap<int,string> m4(m1.begin(),m1.end()); //用迭代器区间所指的数据,作为map容器的元素(包括键值和映照数据),创建一个map容器对象。

3. 成员函数

元素的插入
重载[]元素符

显式地为不同键值赋予内容(映照数据),不过这个方法不能检测是否插入成功。

m1[1] = "xchen"    //插入一个键值对,对于重载[]的插入操作,如果已存在同key元素,直接替换value
insert函数
  • 原型 pair
m1.insert(map<int,string>::value_type(1,"xchen"))//插入一个键值对,对于insert函数的插入操作,如果存在同key元素,不插入

写法二:

m1.insert(std::pair<int,string>(1,"xchen"))   //插入一个键值对,对于insert函数的插入操作,如果存在同key元素,不插入
  • 原型 void insert(InputIterator first, InputIterator lase) 插入区间中的元素
m2.insert(m1.begin(),m1.end())  //将用迭代器区间所指的数据插入到map中
元素的删除
  • 原型 void erase(iterator position)
    //删除迭代器所指向的元素
  • 原型 size_type erase(const key_type& x)
    //删除key值为x的元素
  • 原型 void erase(iterator first, iterator last)
    //删除区间内的元素
元素的检索
  • 原型 size_type count(const key_type& x)
    //返回key值为x的元素个数。map不允许key重复,因此只可能返回0或1
  • 原型 iterator find(const key_type& x)
    //返回key为x的元素的迭代器
  • 原型 iterator lower_bound(const key_type &x)
    //返回map中第一个大于或等于key的迭代器指针
  • 原型 iterator upper_bound(const key_type &x)
    //返回map中第一个大于key的迭代器指针
其他

empty() //判断map是否为空
size() //返回map中元素的个数

4. 迭代器

map具有迭代器

5. 改变排列的顺序

map中的默认排序是基于’<’号操作的,当key不是内置类型而是自定义的结构体或其他没有合法’<’操作的数据类型,map的排序就会出现问题,在insert操作时编译出错。
key为内置类型,可以使用默认的排序规则

#include <map>#include <string>int main(){    std::map<int,std::string> m;    m.insert(std::pair<int,std::string>(1,"aa"));    m.insert(std::pair<int,std::string>(2,"bb"));    return 0;}

key为自定义类型,直接默认insert会编译器error

#include <map>#include <string>class Node{public:    Node():name("abc"){};    std::string name;};int main(){    std::map<Node, int> m;    Node a;    Node b;    m.insert(std::pair<Node,int>(a,1)); //error    m.insert(std::pair<Node,int>(b,1)); //error    return 0;}
  • 自定义排序——重载运算符<
#include <map>#include <string>class Node{public:    Node():name("abc"){};    std::string name;};bool operator<(const Node &n1, const Node &n2){    if(n1.name < n2.name) return true;    else return false;}int main(){    std::map<Node, int> m;    Node a;    Node b;    m.insert(std::pair<Node,int>(a,1));    m.insert(std::pair<Node,int>(b,1));    return 0;}
  • 自定义排序——仿函数
#include <map>#include <string>class Node{public:    Node():name("abc"){};    std::string name;};class m_sort{public:    bool operator()(Node const &n1, Node const &n2)    {        if(n1.name < n2.name) return true;        else return false;    }   };int main(){    std::map<Node, int, m_sort> m;    Node a;    Node b;    m.insert(std::pair<Node,int>(a,1));    m.insert(std::pair<Node,int>(b,1));    return 0;}

底层

红黑树
map就是一棵红黑书,每个结点是pair键值对,以key值排序。

原创粉丝点击