STL之map&multimap容器(笔记)

容器map&multimap控制的长度为N的序列都是以有N个节点的有序二叉树的方式存储的,每个节点中存储一个类型为pair<const key,T>的单个元素;

与set不同只有const key这部分猜参与次序比较,而set是整个元素的值一起参加比较;

typedef map<key,T,less<key>,allocator<pair<const key,T>>> mycont;

构造函数

map() 声明一个按pred()排序的空映射;

map(pr) 声明一个按函数对象pr排序的空映射;

map(pr,al) 跟上面一样不过还存储一个分配器对象al;

map(first,last) 声明一个按pred()排序的映射,她的初始值内容是有指定的序列中复制的;

map(first,last,pr) 声明一个按pr排序的映射,她的初始内容是从指定的序列中复制的;

map(first,last,pr,al) 跟上面的相同,不过她还存储一个分配器对象al;

函数:

clear 删除容器中的所有元素;

erase删除it所指定的元素,返回一个迭代器,指向下一个元素,还可以通过调用erase(key)来删除与键值key次序相等的元素;

insert 插入一个具有{键,值}的元素val返回值是一个累pair<iterator,bool>的对象,只有当被控序列中没有与key次序相等的元素时,成员对象second才会为true,这是成员对象frist指向的被插入的元素;

find 为了在序列中查找一个键值与key次序相等的元素;

lower_bound 在序列中查找第一个键值不排在key之前的元素,它是所有与key次序相等的元素形成的子区间的起始处;

upper_bound 在序列中查找第一个其键值排在key之后的元素,它是境界着所有与key次序相等的元素形成的区间的末端;

equal_range 检测学系列中所有元素都与key次序相等的子区间,返回的迭代器pai<iterator,iterator>(mycont,lower_bound(key),mycont.upper_bound(key));

count 检测调用equal_rang(key)得到的子区间的长度;

key_comp 获得与构造时候相同的规则对键值排序的对象;

value_comp 获得一个可以对元素中存储的{键,值}排序的对象;

map中有一个multimap没有的操作,定位键值与key次序相等的元素,可以用表达式mycont[key],如果没有找到就会指向容器中添加元素[key,mapped_type()],对于multimap对象来说insert每次的调用都会插入一个新元素,函数的返回值是指向这个新元素的迭代器,而不是piar<iterator,bool>对象,如果有多个元素与key次序相等,那没有指定返回的迭代器具体指向哪个元素,

测试:
// new.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "map"
#include "assert.h"
#include "iostream"
using namespace std;

typedef map<char,int> mycont;
typedef multimap<char,int> mcont;
typedef pair<char,int> myval;
int main(int argc, char* argv[])
{
 mycont v1;
 myval xx[3];
 for (int i=0;i<3;i++)
 {
  new(&xx[i])myval('a'+i,1+i);
 }
 assert(v1.empty()&&v1.size()==0);
 v1.insert(xx[0]);
 v1.insert(xx[1]);
 v1.insert(xx[2]);
 assert(v1.size()==3&&(*v1.begin()).first=='a');
 pair<mycont::iterator,bool>pib=v1.insert(myval('d',4));
 assert((*pib.first).second==4&&(*pib.first).first=='d'&&pib.second);
 pib=v1.insert(myval('d',5));
 assert((*pib.first).second==4&&(*pib.first).first=='d'&&!pib.second);
 assert((*--v1.end()).first=='d'); //自动排序;
 assert((*v1.erase(v1.begin())).first&&v1.size()==3);
 assert((*--v1.rend()).first=='b'); //相等与反了一下下,还有++==--
 assert((*v1.rbegin()).first=='d');
 
 assert(v1.key_comp()('a','c')&&!v1.key_comp()('a','a'));
 assert(v1.value_comp()(myval('a',0),myval('c',0)));
 assert(!v1.value_comp()(myval('a',0),myval('a',1)));
 assert((*v1.find('b')).first=='b');
 assert(v1.count('x')==0&&v1.count('b')==1);
 
 mcont v2;
 assert((*v2.insert(v2.begin(),myval('a',1))).first=='a');
 assert((*v2.insert(v2.begin(),myval('a',2))).first=='a');
 assert(v2.size()==2);
 assert((*v2.insert(v2.begin(),myval('a',1))).first=='a');
 assert(v2.size()==3);
 return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值