C++关联容器浅谈:map set multiset multimap ;
在学习C++关联容器之前,简单的介绍一下与之相关的一种标准库类型——pair类型(utility头文件中)
pair的主要操作:pair<T1,T2> p1(v1,v2) 创建一个pair对象,分别为T1,T2类型,first数据成员初始化为v1 second数据成员初始化为v2;make_pair(v1 , v2)以v1,v2值创建一个新的pair对象;
pair创建和初始化:pair<string,string> name("zhangsan","lisi");若需要定义相同且较多的pair类型对象,可使用typedef简化声明 typedef pair<string,string> Name; Name zuozhe("zhangsan","lisi"); Name student("wangwu","zhouliu");...
Map容器:键值对的集合,通常理解为关联数组;使用map对象 先包含map头文件;map的构造函数 map<k,v> m(b,e) 创建map类型的对象,存储迭代器b,e范围内的元素。元素的类型必须能转换为pair<const k,v>
对于map容器的下标应用:如果下标所表示的键在容器不存在,则添加元素:example:
上例创建一个map对象 用来记录单词出现的次数。map<string,int>word_count; string word; while(cin>>word){ ++word_count[word]; }
定义了map对象之后,需要想容器里面添加元素:可以使用insert成员来实现,也可通过下标的形式来定义 如下:对于map容器使用三个函数:#include <iostream> #include <map> #include <string> using namespace std; int main() { map<int,string> name; name.insert(make_pair(1,"zhangsan")); name.insert(make_pair(2,"lisi")); name.insert(make_pair(2,"lisi"));//重复插入将被忽略 name[4] = "zhangsan"; map<int,string>::iterator it; for(it = name.begin();it!=name.end();++it){ cout<<it->first<<":"<<it->second; cout<<endl; } return 0; }
cout<<name.count(1)<<endl; //返回键值1出现的次数 cout<<name.find(1)->second; //是否存在按照键1存在的元素,存在返回该元素的迭代器
cout<<name.erase(1); //删除键值为1的元素
multimap类型:在map容器中可以使用一个键对应多个实例;并且返回的结果是自动排序的,与向容器里添加元素的顺序无关;与map容器包含一样的头文件map;
#include <iostream> #include <map> #include <string> using namespace std; int main() { typedef multimap<string,string> Friend; Friend f; Friend::iterator ib,ie; f.insert(make_pair("aa","bb")); f.insert(make_pair("aa","cc")); f.insert(make_pair("dd","cc")); f.insert(make_pair("aa","dd")); f.insert(make_pair("dd","cc")); ib = f.begin(); ie = f.end(); while(ib!=ie){ cout<<ib->first<<":"<<ib->second<<endl; ++ib; } cout<<"aa好友"<<f.count("aa")<<endl; ib = f.lower_bound("aa"); ie = f.upper_bound("aa"); while(ib!=ie){ cout<<ib->first<<":"<<ib->second<<endl; ++ib; } return 0; }
与map相比较,set只是单纯键的集合,当只想知道一个值是否存在的时候,使用set容器最为理想,使用set集合需要包含set头文件;与map类似,set中的键也是唯一,且不可修改;同时set也使用insert,find,cound,erase函数操作:上例中lower_bound 绑定的是当前键值的迭代器的起始位置,而upper_bound则是当前键值的迭代器的末位置的下一个元素;
#include <iostream> #include <set> #include <vector> using namespace std; int main() { vector<int> ivec; for(vector<int>::size_type i=0;i!=10;i++){ ivec.push_back(i); ivec.push_back(i); } set<int> isec(ivec.begin(),ivec.end()); //初始化isec容器 isec.insert(10); //向set容器中添加数据 isec.insert(11); isec.insert(12); cout<<ivec.size()<<endl; // 值为20 cout<<isec.size()<<endl; // 值为13 不包含相同的键 cout<<isec.count(1)<<endl; //计算容器中键1 的个数,同时也可以查询是否存在1 cout<<(isec.find(13)!=isec.end()); //查看1键 是否存在set容器中
同multimap类似,multiset容器可以存在相同的键,使用之时也需要包含同文件setisec.erase(isec.find(1)); return 0; }