C++ Map 容器(一)

2015-01-27 10:05:50 · 作者: · 浏览: 30
1.Map是c++的一个标准容器,它提供了很好一对一的关系。
?
Map是一种关联是容器,在map中增加和删除元素非常容易。可以修改一个特定的节点而不对其他节点不产生影响,由于map是一种关联式容器,Key--value结构我们必须明确,在map中我们可以根据key的值修改其对应的value的值,而不能修改key的值,其最大的特点是key和value的值可以是任意类型(内部类型你或用户自己定义的类型)。
?
2. Map的特点:
?
? ? ? ?(1)快速建立key--value的索引。key和value可以是任意类型。
?
? ? ? ?(2)map的查询时间复杂度为LogN,也就是如果包含1000个记录,查询次数最多为10次,1,000,000个记录,最多查找20次。
?
? ? ? ?(3)快速插入Key - Value 记录。
?
? ? ? ?(4)快速删除记录
?
? ? ? ?(5)根据Key 修改value记录。
?
? ? ? ?(6)遍历所有记录。
?
3、使用map
?
使用map得包含map类所在的头文件
?
#include
?
map对象是模板类,需要关键字和存储对象两个模板参数:std:map personnel;
?
这样就定义了一个用int作为索引,并拥有相关联的指向string的指针.
?
为了使用方便,可以对模板类进行一下类型定义,
?
typedef map UDT_MAP_INT_CSTRING;
?
UDT_MAP_INT_CSTRING enumMap;
?
4、在map中插入元素
?
改变map中的条目非常简单,因为map类已经对[]操作符进行了重载
?
enumMap[1] = "One";
?
enumMap[2] = "Two";
?
.....
?
这样非常直观,但存在一个性能的问题。插入2时,先在enumMap中查找主键为2的项,没发现,然后将一个新的对象插入enumMap,键是2,值是一个空字符串,插入完成后,将字符串赋为"Two"; 该方法会将每个值都赋为缺省值,然后再赋为显示的值,如果元素是类对象,则开销比较大。我们可以用以下方法来避免开销:
?
enumMap.insert(map :: value_type(2, "Two"))
?
5、查找并获取map中的元素
?
下标操作符给出了获得一个值的最简单方法:
?
CString tmp = enumMap[2];
?
但是,只有当map中有这个键的实例时才对,否则会自动插入一个实例,值为初始化值。
?
我们可以使用Find()和Count()方法来发现一个键是否存在。
?
查找map中是否包含某个关键字条目用find()方法,传入的参数是要查找的key,在这里需要提到的是begin()和end()两个成员,分别代表map对象中第一个条目和最后一个条目,这两个数据的类型是iterator.
?
int nFindKey = 2; //要查找的Key
?
//定义一个条目变量(实际是指针)
?
UDT_MAP_INT_CSTRING::iterator it= enumMap.find(nFindKey);
?
if(it == enumMap.end())
?
{
?
//没找到
?
}
?
else {
?
//找到
?
}
?
通过map对象的方法获取的iterator数据类型是一个std::pair对象,包括两个数据 iterator->first 和 iterator->second 分别代表关键字和存储的数据
?
6、从map中删除元素
?
移除某个map中某个条目用erase()
?
该成员方法的定义如下
?
iterator erase(iterator it); //通过一个条目对象删除
iterator erase(iterator first, iterator last); //删除一个范围
size_type erase(const Key& key); //通过关键字删除
clear()就相当于 enumMap.erase(enumMap.begin(), enumMap.end());
?
总结了一些map基本简单实用的操作!
1. map最基本的构造函数;
? ?mapmapstring; ? ? ? ? mapmapint;
? ?mapmapstring; ? ? ? ? map< char ,string>mapchar;
? ?mapmapchar; ? ? ? ? ? ?mapmapint;
?
2. map添加数据;
?
? ?map maplive; ?
? ?1.maplive.insert(pair(102,"aclive"));
? ?2.maplive.insert(map::value_type(321,"hai"));
? ?3, maplive[112]="April";//map中最简单最常用的插入添加!
3,map中元素的查找:
?
? ?find()函数返回一个迭代器指向键值为key的元素,如果没找到就返回指向map尾部的迭代器。 ? ? ? ?
?
? ?map::iterator l_it;;?
? ?l_it=maplive.find(112);
? ?if(l_it==maplive.end())
? ? ? ? ? ? ? ? cout<<"we do not find 112"<
? ?else cout<<"wo find 112"<
4,map中元素的删除:
? ?如果删除112;
? ?map::iterator l_it;;
? ?l_it=maplive.find(112);
? ?if(l_it==maplive.end())
? ? ? ? cout<<"we do not find 112"<
? ?else ?maplive.erase(l_it); ?//delete 112;
5,map中 swap的用法:
? Map中的swap不是一个容器中的元素交换,而是两个容器交换;
? For example:
? #include
? #include
?
? using namespace std;
?
? int main( )
? {
? ? ? map m1, m2, m3;
? ? ? map ::iterator m1_Iter;
?
? ? ? m1.insert ( pair ?( 1, 10 ) );
? ? ? m1.insert ( pair ?( 2, 20 ) );
? ? ? m1.insert ( pair ?( 3, 30 ) );
? ? ? m2.insert ( pair ?( 10, 100 ) );
? ? ? m2.insert ( pair ?( 20, 200 ) );
? ? ? m3.insert ( pair ?( 30, 300 ) );
?
? ?cout << "The original map m1 is:";
? ?for ( m1_Iter = m1.begin( ); m1_Iter != m1.end( ); m1_Iter++ )
? ? ? cout << " " << m1_Iter->second;
? ? ? cout ? << "." << endl;
?
? ?// T