STL Map使用详解(一)

来源:互联网 发布:查看淘宝佣金的插件 编辑:程序博客网 时间:2024/04/29 05:02

  Map是一种关联容器,用来存储key-value数据。其中的key是用来查找的关键字,value是实际存放的值。

一个特定的关键字只能与一个唯一的值相联系。map是由一对一对的键值(key/value)所组成的排序结构体,

键值是读一无二的(unique)的。

  map通常是以平衡二叉查找树来实现的,因此map对插入,删除,查找能保证log(N)的时间复杂度。对于

海量的数据的插入和查询,map是一个不错的选择。

  本文将对map的常见操作进行讲解。不当之处,欢迎批评指正(bicheng.gui@gmail.com).

  1. map的构造:

map提供了以下模板构造函数:

   template<class T1, class T2>

   map();                         // 默认构造函数

   map(const map& m)    // 拷贝构造函数

   map(iterator begin, iterator end );  //区间构造函数

   map(iterator begin, iterator end, const traits& _compare) //带比较谓词的构造函数

   map(iterator begin, iterator end, const traits& _compare, const allocator& all) //带分配器

例子:

#include <map>

#include <iostream>

using namespace std; 

typedef pair<int,int> int_pair;

map<int,int>::iterator itr1;

map<int,int> m1; //默认升序,从小到大

m1[1] = 10; 

m1[2] = 20;

m1[3] = 30;

//输出结果10 20 30,有换行

for (itr1 = m1.begin(); itr1 != m1.end(); ++itr1)

{

    cout << itr1->second << endl;

}

map<int,int,greater<int>> m2; //降序的map

map<int,int,greater<int>>::iterator itr2;

m2[1] = 10;  //插入键值为1,value为10的元素,multimap不支持operator[]

m2.insert(int_pair(2,20)); //map的valuetype是pair(t1,t2);

m2[3] = 30;

//输出30,20,10

for (itr2 = m2.begin(); itr2 != m2.end(); ++itr2)

{

    cout << itr2->second << endl;

}

//利用m1的内存分配器构造一个m3

map<int,int>::allocator_type al = m1.get_allocator();

map<int,int> m3(less<int>(), al);

//根据m1拷贝一个m4

map<int,int> m4(m1); //谓词和类型必须要匹配。

//根据两个iterator构造map

map<int,int,greater<int>> m5(m2.begin(), m2.end());

//输出m5, 30,20,10 ,带换行。

for (itr2 = m5.begin(); itr2 != m5.end(); ++itr2)

{

    cout << itr2->second << endl;

}

以上代码需要VS2005以上编译器。

2. map的常见操作: 

map支持常见的迭代器接口,例如begin(),end(),rbegin(),rend(). 

empty()        判断map是否为空。为空的话返回真。

size()           返回map的长度

maxsize()    返回map能容纳的最大的元素个数,根据编译器和平台而变化。

3. pair<iterator, bool> insert(iterator where,const value_type& val)

可以插入一个对象,一个对象的若干份拷贝,或者一个范围内的对象.

insert函数把对象插入到where所指的元素之前。

示例代码:

map<int,int>::iterator itr1,itr2;

map<int,int> m1,m2;

typedef pair<int,int> int_pair;

m1.insert( int_pair( 1, 10) );

m1.insert( int_pair( 3, 30) );

由于map容器不允许键值重复,在执行插入操作后,可以根据返回值获取操作是否成功。

返回值是一个迭代器和布尔值的pair,迭代器指向map中具有该值的元素,布尔值表示是否插入成功。

如果布尔值为true,表示插入成功,则迭代器为新插入值在map中的位置。

如果布尔值为false,表示插入失败(已经存在该值),迭代器为原有值在map中的位置。

pair<map<int,int>::iterator, bool> insertresult;

insertresult = m1.insert(int_pair(1,10));

if (insertresult->second)

{

  //插入成功

}

else

{

  //插入失败

}