关联容器 map

http://wenku.baidu.com/link?url=Du0M0tk1-XFP0SK8dFYWyY0L_VOG0flXfWl3_5f7rhrjGDbhq6kRQaN4RveqynWpLITdWaokxuYYxbs-kHESdhodhoLgfYCaJIkXVKSkQoq


1.使用map对象,需要包含头文件 #include <map>
  使用pair对象,需要包含头文件#include <utility>
2.map对象的类型
 map<string,int> word_count;//empty map from string to int
  value_type:pair(const string,int)即pair(const key_type,mapped_type)
  key_type:string
  mapped_type:int
3.map对象迭代器的解引用
  对map迭代器进行解引用将产生一个pair类型的对象
4.map对象的下标类型
  下标类型key_type必须支持'<'操作,因此list的对象和迭代器不能作为key
  对下标类型的操作会返回map容器中定义的mapped_type类型
5.给map添加元素
  map对象能够使用下标访问,如何下标不存在,则会添加一个键值对,它的键就是该下标  
  注意:vector也能使用下标访问,但是如果下标不存在,则会出现访问错误!!!!
6.关于map::insert的使用(使用insert可以避免下标操作带来的副作用:不必要的初始化)
  A. m.insert(e)
    返回类型:pair< map<key_type,mapped_type>::iterator,bool>  
    1.插入单个元素的insert版本使用pair类型的参数,返回一个pair类型的对象,包含一个指向键为e.first的元素的map迭代器以及一个bool
    类型 的对象,表示是否插入了该元素
  例子:
map<string,int> word_count;
word_coutn.insert(map<stirng,int>::value_type("Anna",1));
注意:map<stirng,int>::value_type("Anna,1")是新创建一个pair对象,并直接将其插入到map中
可以简化上述实参
map<stirng,int>::value_type("Anna,1")------>make_pair("Anna",1)
或者使用tepedef:typedef map<string,int>::value_type valType;
word_count.inset(make_pair("Anna",1));或者word_count.insert(valType("Anna",1));
  B.m.insert(begin,end)
    返回类型:void
    1.begin,end是标记元素范围的迭代器,但是元素必须是m.value_type类型的键值对;
    2.对于该范围内的所有元素,如果他的键在m中不存在,则将该键及其关联插入到m中;
  C.m.insert(iterator,e)
    返回类型:返回一个迭代器,指向m中具有给定键的元素
    1.e是一个用在m上得value_tpye类型的值;
    2.如果e.first不在m中,则创建新元素,并以iterator为起点搜索新元素存储的位置 
7.谨记value_tpye是pair<const K,V>类型的同义词 
8.使用count检查map对象中某键是否存在
  对于map对象,count成员只能返回0或者1,因为map中的键是唯一的,所以count可以有效的表明一个键是否存在;
m.count(k) 返回m中k的出现次数
9.读取元素而又不插入改元素
m.find(k)
如果m容器中存在按K的索引的元素,则返回指向改元素的迭代器;否则返回超出末端的迭代器;
10.从map中删除元素
1.m.erase(k):删除m中键为K的元素
返回:size_type类型,表示删除的元素个数;对于map容器,该值必然是0或者1;0表示删除的元素不存在;
2.m.erase(iterator):从m中删除迭代器iterator所指的元素
返回:void类型
注意:iterator必须指向m中确实存在的元素,且不能等于m.end()
3.m.erase(begin,end):删除迭代器begin,end之间的一段元素
返回:void类型

http://share7789.blog.163.com/blog/static/213280152201331112347432/


关联容器和顺序容器的本质差别在于:关联容器通过 键(key)存储和读取元素,而顺序容器则通过元素在容器中的位置顺序存储和访问元素。 

关联容器(Associative containers) 支持通过来高效地查找和读取元素。两个基本的关联容器类型是 map set。map 的元素以键-值(key-value)对的形式组织:键用作元素在 map 中的索引,而值则表示所存储和读取的数据set 仅包含一个键,并有效地支持关于某个键是否存在的查询。 

一般来说,如果希望有效地 存储不同值的集合,那么使用  set 容器比较合适,而 map 容器则更适用于需要 存储(乃至修改)每个键所关联的值的情况。在做某种文本处理时,可使用 set 保存要忽略的单词。而字典则是 map 的一种很好的应用:单词本身是键,而它的解释说明则是值。 

关联容器类型
map  关联数组:元素通过键来存储和读取 
set  大小可变的集合,支持通过键实现的快速读取
multimap  支持同一个键多次出现的 map 类型 
multiset  支持同一个键多次出现的 set 类型 


map 对象的定义 
      
map<string, int> word_count; // empty map from string to int 
 
这个语句定义了一个名为 word_count 的 map 对象,由 string 类型的键
索引,关联的值则 int 型。 

Map的构造函数

map<k, v> m;  创建一个名为 m 的空 map 对象,其键和值的类型分别为 k 和 v

map<k, v> 
m(m2); 
创建 m2 的副本 m,m 与 m2 必须有相同的键类型和值类型 

map<k, v> 
m(b, e); 
创建 map 类型的对象 m, 存储迭代器 b 和 e 标记的范围内所有
元素的副本。元素的类型必须能转换为 pair<const k, v> 

map 类定义的类型 

map<K, 
V>::key_type 
在 map 容器中,用做索引的键的类型 

map<K, 
V>::mapped_type 
在 map 容器中,键所关联的值的类型 

map<K, 
V>::value_type 
一个 pair 类型,它的 first 元素具有  const map<K, 
V>::key_type 类型,而 second 元素则为 map<K, 
V>::mapped_type 类型 
 在学习 map 的接口时,需谨记 value_type 是 pair 类型,它 的值成员可以修改,但键成员不能修改。 
 
使用下标访问 map 对象 
如下编写程序时: 
     map <string, int> word_count; // empty map 
     // insert default initialzed element with key Anna; then assign 1
to its value 
     word_count["Anna"] = 1; 


 
将发生以下事情: 
1.  在 word_count 中查找键为 Anna 的元素,没有找到。 
2.  将一个新的键-值对插入到 word_count 中。它的键是 const string 类型
的对象,保存 Anna。而它的值则采用值初始化,这就意味着在本例中值为 0。
3.  将这个新的键-值对插入到 word_count 中。  
4.  读取新插入的元素,并将它的值赋为 1。  
 
使用下标访问 map 与使用下标访问数组或 vector 的行为截
然不同: 用下标访问不存在的元素将导致在 map 容器中添加一
个新元素,它的键即为该下标值。 

显然,map 迭代器返回 value_type 类型的值——包含 const key_type 和 mapped_type 类型成员的 pair 对象;下标操作符则返回一个 mapped_type 类型的值。 

典型例子:计算文本文件出现的单词,并记录单词出现的频率
对于 map 容器,如果下标所表示的键在容器中不存在,则添加新元素,这一特性可使程序惊人地简练: 
     // count number of times each word occurs in the input 
     map<string, int> word_count; // empty map from string to int 
     string word; 
     while (cin >> word) 
       ++word_count[word]; 
这段程序创建一个 map 对象,用来记录每个单词出现的次数。while 循环每次从标准输入读取一个单词。如果这是一个新的单词,则在 word_count 中添加以该单词为索引的新元素。如果读入的单词已在 map 对象中,则将它所对应的值加 1。 
其中最有趣的是,在单词第一次出现时,会在 word_count 中创建并插入一个以该单词为索引的新元素,同时将它的值初始化为 0。然后其值立即加 1,所以每次在 map 中添加新元素时,所统计的出现次数正好从 1 开始。 

//编写程序统计并输出所读入的单词出现的次数。

#include"head.h"
void main()
{
	map< string, float > map_score;

	/*使用下标访问 map 对象
	**如果在map中找不到这个键值,则插入这个新键
	**如果在map中找到了这个键值,则只更新键所对应的值
	*/
	//map_score["kity"] = 23.43f;
	//map_score["kity"] = 23.11f;
	//map_score["andy"] = 23.22f;

	//cout<< map_score["andy"] << endl;	//下标操作返回左值
	string word;

	//输入单词
	while( cin >> word )
	{
		++map_score[word];
	}

	//map  迭代器进行解引用将产生 pair 类型的对象 
	map< string, float >::const_iterator map_iter = map_score.begin();

	for( ; map_iter != map_score.end(); map_iter++ )
	{
		cout << map_iter->first << ":"
			<< map_iter->second << endl;
	}
}



评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值