//第二十三模板 18.3关联容器
/*顺序容器可使用下标或者迭代器对元素进行顺序或者随机访问,但是不能使用关键值对关键元素进访问
关联容器弥补了这个缺点,关联容器可以使用关键字对关键元素进行访问
标准C++库提供了四个关联容器,映射 多重映射 集合和多重集合*/
//1映射
//标准映射容器类maps要关联容器的一种
/*
begin() 返因指向map头部的迭代器
clear() 删除所有元素
count() 返回指定元素出现的次数
empty() 如果map为空由返回true
end() 返回指向map末尾的迭代器
equal_range()返回特殊条目的迭代器对
erase() 删除一个元素
find() 查找一个元素
get_allocator() 返回map的配置器
insert() 插入元素
key_comp() 返回比较元素key的函数
lower_bound() 返回键值>=给定元素的第一个位置
max_size() 返回可以容红领巾的最大元素个数
rbegin() 返回一个指向map尾部的逆向迭代器
rend() 返回一个指向map头部的逆向迭代器
size() 返回map中元素的个数
swap() 交换两个map
upper_bound() 返回键值>给定元素的第一个位置
value_comp() 返回比较元素value的函数
*/
//map类的方insert()该方法被重载了三次
//iterator insert(iterator pos, const pair<KEY_TYPE,VALUE_TYPE> &val)
//原型插入val到pos的后面,然后返回一个指向这个元素的迭代器
//void insert(input_iterator start, input_iterator end);
//原型插入start到end的元素到map中
//pait<iterator, bool> insert(const pair<KEY_TYPE,VALUE_TYPE>&val)
//原型只有在val不存在时插入val,返回值是一个指向被插入元素的迭代器和一个描述是否插入的bool值
//如何根据关键字搜索关联值
//iterator find(const key_type& k)
//const_iterator find(const key_type& k)const;
/*
#include <iostream>
#include <map>
#include <string>
using namespace std;
typedef map<string,string>::const_iterator CIT;
typedef map<string,string>::value_type cit;
template<class T1, class T2>
void show(CIT &c, map<T1,T2>&n)
{
for(c=n.begin(); c!=n.end(); ++c){
cout<<c->first<<"\t"<<c->second<<endl;
}
}
int main()
{
string str="武汉";
map<string,string>name,name1;
name["范伟"]=str;
name1["朱若军"]="青岛";
name1.insert(name1.end(),cit("朱然","长春")); //将cit插入到name1的尾处
name.insert(name1.begin(),name1.end()); //将name1从开始到结束插入到name中
cout<<"映射容器name中共有"<<name.size()<<"个元素"<<endl;
CIT cit;
show(cit,name);
cout<<"查找关键字为'朱然'的所有内容并输出"<<endl;
cit = name.find("朱然");
if(cit == name.end()){
cout<<"对不起,没有这个关键字"<<endl;
}else{
cout<<cit->first<<"\t"<<cit->second<<endl;
}
cout<<"关键字等于'范伟'的元素的个数为:"<<name.count("范伟")<<endl;
cout<<"删除关键字为'范伟'的所有元素"<<endl;
name.erase("范伟");
cout<<"再次输出映射容器name中的所有元素"<<endl;
show(cit,name);
cout<<"删除映射容器name中所有元素"<<endl;
name.clear();
if(name.empty())
{
cout<<"映射容器name为空"<<endl;
}else{
show(cit,name);
}
system("pause");
return 0;
}*/
//2集合
//set联合容器,或者称为集合,这些数据的值必须是唯一的,这一点与映射容器map很相似,但不同的是set关键字等于数据,map则将关键字与数据分开了,而set容器中的数据都是经过排序后的
/*
begin() 返回指向第一个元素的迭代器
clear() 清除所有元素
count() 返回某个值元素的个数
empty() 如果集合为空,返回true
end() 返回指向最后一个元素的迭代器
equal_reange() 返回集合与给定值相等的上下限的两个迭代器
erase() 删除集合中的元素
find() 返回一个指向被查找到元素的迭代器
get_allocator() 返回集合的分配器
insert() 在集合中插入元素
lower_bound() 返回指向大于(或等于)某值的第一个元素的迭代器
key_comp() 返回一个用于元素间值比较的函数
max_size() 返回集合通容纳的元素的最大限值
rbegin() 返回指向集合最后一个元素的返回迭代器
rend() 返回指向集合中第一个元素的返向迭代器
size() 集合中元素的数目
swap() 交换两个集合变量
upper_bound() 返回大于某个值元素的迭代器
value_comp() 返回一个用于比较元素间的值的函数
*/
/*
#include <iostream>
#include <iterator>
#include <set>
#include <string>
using namespace std;
typedef set<string>::const_iterator CIT;
template<class T>
void show(CIT&it, set<T>&s)
{
for(it = s.begin(); it!=s.end(); ++it)
{
cout<<*it<<"\t";
}
cout<<endl;
}
int main()
{
const int N=5;
string s1[N]={"Mick","Bill","Gate","Rose","Jane"};
string s2[N]={"张锋","秦平","李力","陆放","胡涛"};
set<string>name1;
name1.insert(s1,s1+N);
set<string>name2(s2,s2+N);
CIT it;
cout<<"输出name1中各个元素:"<<endl;
show(it,name1);
cout<<"输出name2中各个元素"<<endl;
show(it,name2);
cout<<"查找name1中大于或者等于关键字'李力'的第一个元素"<<endl;
it = name2.lower_bound("李力");
cout<<*it<<endl;
cout<<"查找name1中大于关键字李力'的第一个元素"<<endl;
it = name2.upper_bound("李力");
cout<<*it<<endl;
system("pause");
return 0;
}*/