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