C++STL之multiset与multimap容器
1. Multiset
Multiset是set集合容器的一种,其拥有set的全部内容,在此基础之上,multiset还具备了可以重复保存元素的功能,因此会有略微和set的差别。
Multise容器在执行insert()时,只要数据不是非法数据和空数据,insert就总是能够执行,无论时一个数据还是一段数据。
Multiset容器中的find()函数回返回和参数匹配的第一个元素的迭代器,即时存在多个元素也只是返回第一个,如{10,20,20,20}搜索20进行匹配将会返回第二个参数,如果没有符合的参数则结束迭代器。
同理诸如lower_bound()等的需要进行一个位置的返回值,则统统返回第一个发现的值。
以下是一个举例:
#include <iostream> #include <set> #include <algorithm> using namespace std; int main(){ multiset<int> ms; ms.insert(10); ms.insert(20); ms.insert(10); ms.insert(20); ms.insert(30); ms.insert(50); //{10,20,10,20,30,50} -----> {10,10,20,20,30,50} 插入时即会自动排序 cout<< "发现20的位置在" << *ms.find(20)<<endl; //这样是找不出来的哟 int i=0; for(multiset<int>::iterator it=ms.begin();it!=ms.find(20);it++,i++){} cout<< "发现20的位置在" << i <<endl; //由于是从0开始计算的因此答案是2 return 0; }
举例使用find进行查询了集合元素的位置,我们可以发现,这样使用实则麻烦而且浪费算力,的确,STL中提供的迭代器的思路是:提供一种方法顺序访问一个聚合对象中各个元素,而又不需暴露该对象的内部表示。
也就是说,我们使用迭代器进行访问的时候,迭代器是不会告诉你你需要访问的元素是数据内部的第几个位置,这样匿名的思路对于工程的设计是有帮助的。
2. Multimap容器
Multimap时map映射容器的一种,其拥有map的全部内容,并在此基础之上,multimap还具有了可以重复保存元素的功能,与上文的mutliset差不多,任何进行访问单个值得语句访问均只会返回第一个位置,这里不再多说,而是举一个实际中可能用得到得例子。
有没有一种方法,使得一个key值能够对应多个value,产生一种诸如一个学生有多门考试成绩一样的映射
我们都知道map关联容器是使得一个数据与另一个数据发生映射的容器,通过key得到value产生一一对应,那么multimap在此基础上使得map元素可以重复,因此这种情况可以使用multimap
#include <iostream> #include <string> #include <map> using namespace std; int main(){ multimap<string, int> m_map; string name="XiaoMing"; m_map.insert(make_pair(name, 50)); m_map.insert(make_pair(name, 55)); m_map.insert(make_pair(name, 60)); //方式1 cout<<"----------方法1-----------"<<endl; int k; multimap<string, int>::iterator m; m = m_map.find(name); for (k = 0; k != m_map.count(name); k++, m++) cout << m->first << "--" << m->second << endl; //方式2 cout<<"----------方法2-----------"<<endl; multimap<string, int>::iterator beg, end; beg = m_map.lower_bound(name); end = m_map.upper_bound(name); for (m = beg; m != end; m++) cout << m->first << "--" << m->second << endl; //方式3 cout<<"----------方法3-----------"<<endl; beg = m_map.equal_range(name).first; end = m_map.equal_range(name).second; for (m = beg; m != end; m++) cout << m->first << "--" << m->second << endl; return 0; }
方法一:标准的iterator的访问方法,通过find函数找到所需要知道的关系”XiaoMing”的位置,再进行”XiaoMing”的计数,输出共”XiaoMing”数量个数的元素内容,以达到需求目的。
方法二:通过lower_bound和upper_bound找到”XiaoMing”的范围进行输出。
方法三:通过equal_range获取全部的”XiaoMing”内容的元素,再通过迭代器进行输出。
这三种方法思想大同小异,请自主取舍进行巩固学习