c语言multiset函数,C++STL之multiset与multimap容器

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”内容的元素,再通过迭代器进行输出。

这三种方法思想大同小异,请自主取舍进行巩固学习

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值