【ACM】Map

1.map简介
map的特性是,所有的元素都会根据元素的键值自动被排序,map的所有元素都是pair类型,同时拥有键值和实值。pair的第一元素被看做键值(也就是说是按照第一元素进行排序的),第二元素被看做实值。map不允许两个元素具有相同的键值。

在map中是不可以通过map的迭代器改变map的键值,因为map元素的键值关系到map元素的排列规则,任意的改变map元素的键值会严重破坏map组织。但是可以通过迭代器改变map元素的实值。因此,map iterators 既不是 constant iterators(常量迭代器),也不是一中 mutable iterators(可变迭代器)。

map中进行新增和删除操作都是很小代价的,操作之前的所有迭代器,在操作之后还是有效的(被删除那一个元素的迭代器是例外)。

2.map常见的操作
map的实现是以红黑二叉树(一种平衡二叉搜索树)为底层机制(还有一种以哈希表为底层机制的map)。
map是一种关联容器,每一个关联容器都定义了一个默认构造函数,他创建一个指定类型的空容器。
初始化:

map<string , int > num; //空容器

map<string , string> name ={{"q1" , "q2"}  , {"w1","w2"}  , {"e1","e2"}};//列表初始化

map<char , int> stu;
stu['a'] = 10;
stu['b'] = 20;//利用键值进行初始化

添加元素:
map类型的元素插入有两种方式。一种是使用insert函数,另一种是直接进行查找,过程是先查找map中是否有键值为key的元素存在,如果存在,使用新的值修改原值,如果不存在,首先在map中插入该键值,然后在用内容初始化这个键值对应的实值。(最好是使用insert进行插入)

pair<map<string, int>::iterator,bool> ret = myMap.insert(pair<string, int>("xxxxxx", 2));

此处要注意insert函数的返回值,它返回一个pair类型的值,first是一个map实体的迭代器,指向插入键值所表示的元素。second是一个bool变量,表示是否插入成功,如果为true,表示插入成功,如果是false,则表示该键值已经存在,且不进行任何改变(与直接进行查找不一样)。一般情况下不会保存insert函数的返回值。

#include <cstdio>
#include <map>
#include <utility>
#include <iostream>

using namespace std;

int main()
{
    map<string ,int> a;
    a.insert(make_pair("hello",1));
    a.insert(make_pair("hello",2));
    cout<<a["hello"]<<endl;
    return 0;
}

结果是1,也就是说没有过任何变化。如果已经存在,不会改变原先的实值。
下面给出两种插入操作的方式。

    a.insert(make_pair("hello",1));
    a.insert(map<string,int>::value_type("world",5));
    a["hi"] = 3

insert后面的数据是pair类型或者是value_type类型,其实这两种类型是等价的。
第三种方式,如果是不存在key,则创建一个键值为key(hi)的元素,实值为3,如果已经存在,改变实值。

查找元素:

     map<string ,int> node;
     node.insert(make_pair("hello",1));
     map<string ,int >::iterator p;//定义迭代器
     p = node.find("hello");
     cout<<p->second<<endl;

find操作返回一个迭代器,该迭代器指向键值为key的元素,如果没有找到就返回指向map尾部的迭代器。find的参数接受一个键值。

删除操作:

      map<string ,int> p;
      p.insert(make_pair("hello",5));
      map<string ,int >::iterator it;
      it = p.find("hello");
      if(it == p.end())
      cout<<"not find"<<endl;
      else
      p.erase(it);

删除操作erase接受一个迭代器,把该迭代器指向的位置元素删除。

迭代器范围:

map<string ,int> p;
map<string ,int>::iterator it;
it = p.begin();
it != p.end();

一个前闭后开的区间,也就是说begin指向第一个元素,但是end指向最后一个元素的后面的位置。

其他常见操作:(有待完善)
注意:map中不能用容器访问first和second,这两个元素是针对与pair类型的,所以应该是用迭代器指向一个元素,然后采用运算符->访问。
clear() 清空所有元素
empty() 判断是否为空,为空返回true(返回bool类型)
max_size() 返回可以容纳的最大元素个数
rbegin() 返回一个指向map尾部的逆向迭代器
rend() 返回一个指向map头部的逆向迭代器
size() 返回map中的元素的个数

排序函数:
(待完善)

map的排序机制:
map是如何对各种键值类型进行排序的

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值