现在的位置: 首页 > 综合 > 正文

第十章 关联容器

2013年07月22日 ⁄ 综合 ⁄ 共 1870字 ⁄ 字号 评论关闭

关联容器的类型

map          通过键来存储和读取

set            集合

multimap          支持一个键多次出现的map

multiset            支持一个键多次出现的集合

10.1 引言pair类型

utillity头文件中定义

 

1) 初始化

pair <T1,T2> p1;

pair <T1,T2> p2(v1,v);

 

//初始化可以简化

typedef pair<string,string> Author;

Author prost(“aa”,”bb”);

 

2) 操作

p1.first();

p2.second();

 

3) 生成新的pair对象

pair<string,strnig> newPair=make_pair(“1”,”2”);//等价于newPair=pair<string,string>(“1”,”2”);

10.2 map

1)      
初始化

map<k,v> m;

map<k,v> m(m2);

map<k,v> m(b,e);

 

键类型必须有
< 操作符

 

2)      
map定义的类型

 

map<k,v>::key_tpye;//索引的类型

map<k,v>::mapped_type; //索引对应的关联对象的类型

map<k,v>::value_type;//pair类型

 

3)      
添加元素 insert

4)      
使用下标访问

例子1:

map<string,int> word_count;

word_count[“Anna”] = 1;//增加新成员,这里和vector很不一样

 

例子2:

//单词统计程序

map<string,int> word_count;

string word;

while(cin>>word)

         ++word_count[word];//相当方便

 

5)      
map::insert的使用

m.insert(v);

m.insert(b,e);

m.insert(iter,e);

 

例子:

word_count.insert(make_pair(“1”,1));

或者

typedef map<string,int> :: value_type
valType;

word_count.insert(valType(“1”,1));

 

有一个版本的insert的返回值比较诡异

例子:

pair<
map<string,int>::iterator,bool > ret =
word_count.insert(mak_pair(word,1));

 

6)      
查找存储的元素

a.      
下标

b.      
m.count(k);//返回k出现的次数 0 或者1

c.      
m.find(k);//返回第指向k索引元素的迭代器,如果没有则返回尾端的迭代器

 

7)      
删除

m.erase(k);

m.erase(p);

m.erase(b,e);

 

8)      
迭代器中元素存储的时候按照升序存储

10.3 set 类型

只是一些值的集合,操作与map差不多

 

10.3 multimap multiset类型

 

1)mapset相近的方法

他们的conunt()函数不只返回01

他们的find()函数只返回第一个出现的元素

他们的相同元素将相邻存放

 

2) 独有的方法

lower_bound(k);//返回一个迭代器,指向键不小于k的第一个元素

upper_bound(k);//返回一个迭代器,指向键大于k的第一个元素

equal_range();//他的第一个值等于lower_bound(k)
第二个值等于upper_bound(k)

 

例子1:

typedef multimap<string,string>
::iterator authors_it;

authors_it beg=authors.lower_bound(search_item),

                   end=authors.upper_bound(search_item);

while(beg!=end)//关注这里的判断条件

{

         cout<<beg->second<<endl;

         ++beg;

}

 

例子2:

 pair<authors_it,authors_it>

         pos
= authors.equal_range(search_item);

while(pos.first!=pos.second)

{

         cout<<pos.first->second<<endl;

         ++pos.first;

}

抱歉!评论已关闭.