关联容器的类型
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)与map和set相近的方法
他们的conunt()函数不只返回0或1
他们的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;
}