C++的STL中map与multimap

C++的STL中map与multimap

一、map与multimap的区别等同于set 与multiset的区别。

map是关联容器,map 的每个元素都分为关键字和值两部分,容器中的元素是按关键字排序的,并且不允许有多个元素的关键字相同。

注意,不能直接修改 map 容器中的关键字。因为 map 中的元素是按照关键字排序的,当关键字被修改后,容器并不会自动重新调整顺序,于是容器的有序性就会被破坏,再在其上进行查找等操作就会得到错误的结果。

要使用map,必须包含<map>关键字。

二、map功能

自动建立Key - value的对应。key 和 value可以是任意你需要的类型。

根据key值快速查找记录,查找的复杂度基本是Log(N),如果有1000个记录,最多查找10次,1,000,000个记录,最多查找20次。

快速插入Key -Value 记录。

快速删除记录

根据Key 修改value记录。

遍历所有记录。

key:

map的第一个关键字,也就是key,每个key只能在map中出现一次。

value:

map的第二个参数,也称为对应key的值。

map内部数据排列其实是内部自建一颗红黑树(非严格意义上的平衡二叉树),这颗树具有对数据自动排序的功能,所以在map内部所有的数据都是有序的,红黑树的特点是增加和删除节点对迭代器的影响很微弱,操作的话只对操作节点有影响。

对于迭代器来说,可以修改实值,而不能修改key。

template < class Key, class T, class Pred = less<Key>, class A = allocator<T> >
class map{
    ...
    typedef pair< const Key, T > value_type;
    ...
};

map 和 multimap 十分类似,区别在于 map 容器中元素的关键字不能重复。multimap 有的成员函数,map 都有。此外,map 还有成员函数 operator[]:

T & operator[] (Key k);

该成员函数返回 first 值为 k 的元素的 second 部分的引用。如果容器中没有元素的 first 值等于 k,则自动添加一个 first 值为 k 的元素。如果该元素的 second 成员变量是一个对象,则用无参构造函数对其初始化。

#include <iostream>
#include <map>    //map的头文件 
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
using namespace std;

template<typename T1,typename T2>
ostream &operator<<(ostream &o,const pair<T1,T2> &p){ //pair对象输出为(first,second)形式 
	o<<"("<<p.first<<","<<p.second<<")";
	return o;
}

template<class T>
void Print(T first,T last){
	//输出pair的fitst,last区间 
	for(;first!=last;++first)
		cout<<*first<<" ";
		cout<<endl;
}
typedef map<int,double,greater<int> > MYMAP; //此容器关键字为整形,元素按关键字从大到小排序 
int main(int argc, char** argv) {
	MYMAP mp;
	mp.insert(MYMAP::value_type(15,2.7));
	pair<MYMAP::iterator,bool> p=mp.insert(make_pair(15,99.3));
	if(!p.second)
		cout<<*(p.first)<<"already exists"<<endl; //会输出 
		cout<<"1)"<<mp.count(15)<<endl;
		mp.insert(make_pair(20,9.3));
		cout<<"2)"<<mp[40]<<endl; //如果没有关键字为40的元素,则插入一个 
		cout<<"3)";
		Print(mp.begin(),mp.end());
		mp[15]=6.28; //把关键字为15的元素值改成6.28 
		mp[17]=3.14; //插入关键字为17的元素,并将其值设为3.14 
		cout<<"4)";
		Print(mp.begin(),mp.end()); 
	return 0;
}

要访问关键字为 40 的元素。在没有这个元素的情况下,一个关键字为 40、值为 0 的元素被自动插入容器。mp[40] 等价于mp.operator[](40);,其返回值是关键字为 40 的那个元素(不论是原有的还是新插入的)的 second 成员变量的引用。后面两行的道理与此类似。

三、Map常用函数

  C++ maps是一种关联式容器,包含“关键字/值”对

     begin()         返回指向map头部的迭代器

     clear()        删除所有元素

     count()         返回的是被查找元素的个数。如果有,返回1;否则,返回0。注意,map中不存在相同元素,所以返回值只能是                            1或0。

     empty()         如果map为空则返回true

     end()           返回指向map末尾的迭代器

     equal_range()   返回特殊条目的迭代器对

     erase()         删除一个元素

     find()          查找一个元素

     get_allocator() 返回map的配置器

     insert()        插入元素

     key_comp()      返回比较元素key的函数

     lower_bound()   返回键值>=给定元素的第一个位置

     max_size()      返回可以容纳的最大元素个数

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

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

     size()          返回map中元素的个数

     swap()           交换两个map

     upper_bound()    返回键值>给定元素的第一个位置

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

四、迭代器

map<long long,int>::iterator t;
 
	for(t=p.begin();t!=p.end();t++)
{......
.....}
//前向迭代器、反向迭代器、数组形式输出
    for(it = int_str.begin(); it != int_str.end(); it++)          //正向输出 
        cout<<it->first<<' '<<it->second<<endl;  
    map<int, string>::reverse_iterator iter;  
    for(iter = int_str.rbegin(); iter != int_str.rend(); iter++)  //反向输出 
        cout<<iter->first<<"  "<<iter->second<<endl;  
    for(int i = 1; i <= int_str_n; i++)                           //数组形式输出 
         cout<<int_str[i]<<endl; 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值