//第二十三模板 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; }*/