面对现实,超越自己
逆水行舟,不进则退
posts - 269,comments - 32,trackbacks - 0
C++ Maps & MultiMaps

C++ Maps
是一种关联式容器,包含“关键字/值”对。
C++ Multimapsmaps很相似,但是MultiMaps允许重复的元素。
1.begin() 返回指向map头部的迭代器
2.clear() 删除所有元素
3.count() 返回指定元素出现的次数
   语法:
   size_type count( const KEY_TYPE &key );
   //返回map中键值等于key的元素的个数
4.empty() 如果map为空则返回true
5.end() 返回指向map末尾的迭代器
6.equal_range() 返回特殊条目的迭代器对
   语法:
   pair equal_range( const KEY_TYPE &key );
   返回两个迭代器,指向第一个键值为key的元素和指向最后一个键值为key的元素
7.erase() 删除一个元素
   语法:
   void erase( iterator i ); //删除i元素
   void erase( iterator start, iterator end ); //删除从start开始到end(不包括end)结束的元素
   size_type erase( const key_type &key );
   //删除等于key值的所有元素(返回被删除的元素的个数)
8.find() 查找一个元素
   语法:
iterator find( const key_type &key );
   查找等于key值的元素,并返回指向该元素的迭代器;
   //如果没有找到,返回指向集合最后一个元素的迭代器.
9.get_allocator() 返回map的配置器
10.insert() 插入元素
   语法:
   iterator insert( iterator pos, const pair<KEY_TYPE,VALUE_TYPE> &val );
   //插入valpos的后面,然后返回一个指向这个元素的迭代器
   void insert( input_iterator start, input_iterator end );
   //插入startend的元素到map
   pair<iterator, bool> insert( const pair<KEY_TYPE,VALUE_TYPE> &val );
   //只有在val不存在时插入val。返回指向被插入元素的迭代器和描述是否插入的bool
11.key_comp() 返回比较元素key的函数
   语法:
   key_compare key_comp();
   //返回一个用于元素间值比较的函数对象
12.lower_bound() 返回键值>=给定元素的第一个位置
   语法:
   iterator lower_bound( const key_type &key );
   //返回一个指向大于或者等于key值的第一个元素的迭代器
13.max_size() 返回可以容纳的最大元素个数
14.rbegin() 返回一个指向map尾部的逆向迭代器
15.rend() 返回一个指向map头部的逆向迭代器
16.size() 返回map中元素的个数
17.swap() 交换两个map
   语法:
   void swap( map &obj );
   //swap()交换obj和现map中的元素
18.upper_bound() 返回键值>给定元素的第一个位置
   语法:
   iterator upwer_bound( const key_type &key );
   //返回一个指向大于key值的第一个元素的迭代器
19.value_comp() 返回比较元素value的函数
   语法:
   value_compare value_comp();
//返回一个用于比较元素value的函数

MapSTL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值)的数据处理能力,由于这个特性,map内部的实现自建一颗红黑树(一种非严格意义上的平衡二叉树),这颗树具有对数据自动排序的功能。

下面举例说明什么是一对一的数据映射。比如一个班级中,每个学生的学号跟他的姓名就存在着一一映射的关系,这个模型用map可能轻易描述,很明显学号用int描述,姓名用字符串(string)描述。

下面给出map描述代码:

1.声明方式:     

1       Map<intstring> mapStudent;

2.数据的插入

第一种:用insert函数插入pair数据

1       Map<intstring> mapStudent; 
2       mapStudent.insert(pair<intstring>(1, “student_one”)); 

      第二种:用insert函数插入value_type数据

1       Map<intstring> mapStudent; 
2       mapStudent.insert(map<intstring>::value_type (1, “student_one”)); 

     第三种:用数组方式插入数据

1       Map<intstring> mapStudent; 
2       mapStudent[1= “student_one”; 
3       mapStudent[2= “student_two”; 

    3. map的大小

1 Int nSize = mapStudent.size(); 

    4. 数据的遍历

第一种:应用前向迭代器

1       map<intstring>::iterator iter; 
2       for(iter = mapStudent.begin(); iter !=   mapStudent.end(); iter++
3       Cout<<iter->first<<” ”<<iter->second<<end; 

     第二种:应用反相迭代器   

1       map<intstring>::reverse_iterator iter; 
2       for(iter = mapStudent.rbegin(); iter != mapStudent.rend(); iter++
3       Cout<<iter->first<<” ”<<iter->second<<end;

第三种:用数组方式     

1       int nSize = mapStudent.size() 
2       for(int nIndex = 1; nIndex <= nSize; nIndex++
3       Cout<<mapStudent[nIndex]<<end;

5. 数据的查找(包括判定这个关键字是否在map中出现)

第一种:用count函数来判定关键字是否出现,但是无法定位数据出现位置

第二种:用find函数来定位数据出现位置它返回的一个迭代器,

当数据出现时,它返回数据所在位置的迭代器,如果map中没有要查找的数据,它返回的迭代器等于end函数返回的迭代器

 1 int main() 
 2 
 3       Map<intstring> mapStudent; 
 4       mapStudent.insert(pair<intstring>(1, “student_one”)); 
 5       mapStudent.insert(pair<intstring>(2, “student_two”)); 
 6       mapStudent.insert(pair<intstring>(3, “student_three”)); 
 7       map<intstring>::iterator iter; 
 8       iter = mapStudent.find(1); 
 9       if(iter != mapStudent.end()) 
10       { 
11          Cout<<”Find, the value is ”<<iter->second<<endl; 
12       } 
13       Else 
14       { 
15          Cout<<”Do not Find”<<endl; 
16       } 
17 

第三种:这个方法用来判定数据是否出现

Lower_bound函数用法,这个函数用来返回要查找关键字的下界(是一个迭代器)

Upper_bound函数用法,这个函数用来返回要查找关键字的上界(是一个迭代器)

例如:map中已经插入了1234的话,如果lower_bound(2)的话,返回的2,而upper-bound2)的话,返回的就是3

Equal_range函数返回一个pairpair里面第一个变量是Lower_bound返回的迭代器,pair里面第二个迭代器是Upper_bound返回的迭代器,如果这两个迭代器相等的话,则说明map中不出现这个关键字,程序说明

1 mapPair = mapStudent.equal_range(2); 
2 if(mapPair.first == mapPair.second) 
3 cout<<”Do not Find”<<endl; 

6. 数据的清空与判空

清空map中的数据可以用clear()函数,判定map中是否有数据可以用empty()函数,它返回true则说明是空map

7. 数据的删除

这里要用到erase函数,它有三个重载了的函数

迭代器删除   

1    iter = mapStudent.find(1); 
2    mapStudent.erase(iter);

用关键字删除  

1 Int n = mapStudent.erase(1);//如果删除了会返回1,否则返回0

用迭代器,成片的删除

1 mapStudent.earse(mapStudent.begin(),  mapStudent.end()); 
2 //成片删除要注意的是,也是STL的特性,删除区间是一个前闭后开的集合
3 

posted on 2012-06-04 16:57 王海光 阅读(1639) 评论(0)  编辑 收藏 引用 所属分类: STL

只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理