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

c++学习8

2017年06月01日 ⁄ 综合 ⁄ 共 1874字 ⁄ 字号 评论关闭

set类头型(头文件set)

set只是单纯的键集合;支持大部分的map的操作,包括:insert,count,find,以及erase;

set 不支持下标操作符,而且value_type不是pair类型而是key_type类型。这一差别体现了set存储的元素仅仅是键而没有所关联的值,和map一样,键值是唯一的。而且不能修改。

vector<int>ivec;
for(vector<int>::size_type i=0;i!=10;++)
{
ivec.push_back(i);
ivec.push_back(i);
}
set<int>iset(ivec.begin(),ivec.end());
cout<<ivec.size();//20
cout<<iset.size();//10

vector中存储了20个元素;而set容器中仅有10个元素;因set键是唯一的,不会有重样的值。

mutimap和mutiset类型:

由于键不要求是唯一的,因此每次调用insert总会添加一个元素。例如:

authors.insert(make_pair(string("sunshine.li"),string("平凡的世界")));
authoes.insert(make_pair(string("shuju.ku"),string("假如给我三天光明")));

带有一个键参数的erase版本将删除拥有该键的所有元素,并返回删除元素的个数,而带一个活一堆迭代器参数的版本值删除指定的元素,并返回void;

mutimap<string,string>authors;
string item("gao");
multimap<string,string>::size_type cnt=authors.erase(item);//返回删除元素的个数

关联容器map和set的元素时按顺序存储的,而multimap和mutilset也一样,因此,在multimap和multiset容器中如果某个键对应多个实例,则这些实例在容器中将相邻存放。

迭代遍历multimap和multiset是,可保证一次返回特定键所关联的所有元素。

string item("gaolaoshi ");
typedef multimap<string ,string>::size_type sztype;
sztype cnt=authors.count(item);
multimap<string,string>::iterator iter=authors.find(item);
for(sztype i=0;i!=cnt;++i,++iter)
 cout<<iter->second<<endl;

首先count确定某作者所写的书籍数目,然后调用find获得指向第一个该键所关联的元素的迭代器,for循环迭代次数依赖于count返回的值。

返回迭代器的关联容器操作(使用与所有关联容器)

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

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

m.equal_range(k);//返回一个迭代器的pair对象,它的first成员等价于m.lower_bound(k),而second成员等价于m.upper_bound(k)

lower_bound返回的迭代器不一定指向拥有特定键的元素,如果该键不在容器中,则low_bound返回在应保持容器元素顺序的前提下该键应被插入的第一个元素。

使用这些操作,可重写程序如下:

typedef multimap<string,string>::iterator iter;
iter beg=authors.lower_bound(item),
       end=authors.upper_bound(item);
while(beg!=end)
{
cout<<beg->second;
++beg;
}

若该键没有关联的元素,则这俩个操作返回相同的迭代器:都指向同一个元素或同时指向multimap的超出末端的位置。他们都指向在应保持容器元素顺序的前提下该键应被插入的第一个元素。

使用equal_range(k)更直接:

typedef multimap<string,string>::iterator iter;
pair<iter,iter>par=authors.eque_range(item);
while(par.first!=par.second)
{
cout<<par.second;
++par.first;
}

【上篇】
【下篇】

抱歉!评论已关闭.