C++ STL multiset容器详解
前面章节中,对 set 容器做了详细的讲解。回忆一下,set 容器具有以下几个特性:
不再以键值对的方式存储数据,因为 set 容器专门用于存储键和值相等的键值对,因此该容器中真正存储的是各个键值对的值(value);
set 容器在存储数据时,会根据各元素值的大小对存储的元素进行排序(默认做升序排序);
存储到 set 容器中的元素,虽然其类型没有明确用 const 修饰,但正常情况下它们的值是无法被修改的;
set 容器存储的元素必须互不相等。
在此基础上,C++ STL 标准库中还提供有一个和 set 容器相似的关联式容器,即 multiset 容器。所谓“相似”,是指 multiset 容器遵循 set 容器的前 3 个特性,仅在第 4 条特性上有差异。和 set 容器不同的是,multiset 容器可以存储多个值相同的元素。
和 set 类模板一样,multiset 类模板也定义在也就是说,multiset 容器和 set 容器的差别在于,multiset 容器允许存储多个值相同的元素,而 set 容器中只能存储互不相同的元素。
<set>头文件,并位于 std 名空间中。这意味着,如果想在程序中使用 multiset 容器,该程序代码应包含如下语句:#include <set>
using namespace std;
注意,第二行代码不是必需的,如果不用,则后续程序中在使用 multiset容器时,需手动注明 std 名空间(强烈建议初学者使用)。
multiset 容器类模板的定义如下所示:
显然,multiset 类模板有 3 个参数,其中后 2 个参数自带有默认值。值得一提的是,在实际使用中,我们最多只需要使用前 2 个参数即可,第 3 个参数不会用到。template < class T, // 存储元素的类型
class Compare = less<T>, // 指定容器内部的排序规则
class Alloc = allocator<T> > // 指定分配器对象的类型
> class multiset;
创建C++ multiset容器的方法
创建 multiset 容器,无疑需要调用 multiset 类模板中的构造函数。值得一提的是,multiset 类模板提供的构造函数,和 set 类模板中提供创建 set 容器的构造函数,是完全相同的。这意味着,创建 set 容器的方式,也同样适用于创建 multiset 容器。考虑到一些读者可能并未系统学习 set 容器,因此这里还是对 multiset 容器的创建做一下详细的介绍。
multiset 类模板中提供了 5 种构造函数,也就代表有 5 种创建 multiset 容器的方式,分别如下。
1) 调用默认构造函数,创建空的 multiset 容器。比如:
std::multiset<std::string> mymultiset;
由此就创建好了一个 mymultiset 容器,该容器采用默认的如果程序中已经默认指定了 std 令空间,这里可以省略 std::。
std::less<T>规则,会对存储的 string 类型元素做升序排序。注意,由于 multiset 容器支持随时向内部添加新的元素,因此创建空 multiset 容器的方法比较常用。
2)除此之外,multiset 类模板还支持在创建 multiset 容器的同时,对其进行初始化。例如:
该行代码在创建 copymultiset 容器的基础上,还会将 mymultiset 容器中存储的所有元素,全部给 copymultiset 容器一份。std::multiset<std::string> mymultiset{ "http://c.biancheng网站站点" rel="nofollow" />
"http://c.biancheng网站站点" rel="nofollow" /> std::multiset<std::string> copymultiset(mymultiset);
//等同于
//std::multiset<std::string> copymultiset = mymultiset;
另外,C++ 11 标准还为 multiset 类模板新增了移动构造函数,其功能是实现创建新 multiset 容器的同时,利用临时的 multiset 容器为其初始化。比如:
multiset<string> retMultiset() {
std::multiset<std::string> tempmultiset{ "http://c.biancheng网站站点" rel="nofollow" />
std::multiset<std::string> mymultiset{ "http://c.biancheng网站站点" rel="nofollow" />
"http://c.biancheng网站站点" rel="nofollow" /> std::multiset<std::string, std::greater<string> > mymultiset{
"http://c.biancheng网站站点" rel="nofollow" />
"http://c.biancheng网站站点" rel="nofollow" /> #include <iostream>
#include <set>
#include <string>
using namespace std;
int main() {
std::multiset<int> mymultiset{1,2,2,2,3,4,5};
cout << "multiset size = " << mymultiset.size() << endl;
cout << "multiset count(2) =" << mymultiset.count(2) << endl;
//向容器中添加元素 8
mymultiset.insert(8);
//删除容器中所有值为 2 的元素
int num = mymultiset.erase(2);
cout << "删除了 " << num << " 个元素 2" << endl;
//输出容器中存储的所有元素
for (auto iter = mymultiset.begin(); iter != mymultiset.end(); ++iter) {
cout << *iter << " ";
}
return 0;
}
程序执行结果为:
multiset size = 7
multiset count(2) =3
删除了 3 个元素 2
1 3 4 5 8
注意,表 1 中大多数成员方法的用法,和 set 容器中相应成员方法的用法是完全一样的,只是调用者不同。因此,如果读者想详细了解表 1 中某个成员方法的用法,可以阅读讲解 set 容器相同成员方法的文章。
- 随机文章
- 儿童教育文章(儿童教育)
- 广州4a广告公司(广州4a广告公司创意总监年薪)
- 抖音卡(抖音卡顿怎么解决)
- xboxones(xboxone手柄怎么配对主机)
- 兵马俑(兵马俑介绍和历史背景)
- 陈武简历
- 帆船比赛(帆船比赛视频)
- 海猫鸣泣之时游戏(海猫鸣泣之时游戏在哪玩)
- 韩国媳妇和小雪(韩国媳妇和小雪的父亲工资是多少)
- 儋州市第二中学(儋州市第二中学录取分数线)
- 鬼泣5攻略(鬼泣5攻略第三关怎么跳)
- 地球日主题(2020年世界地球日主题)
- yy魔兽(yy魔兽世界)
- 国外成人游戏(国外成人游戏注册需要visa信用卡)
- 充值卡代理(充值卡代理加盟)
- 拆奶罩
- 郭妮小说(恶魔的法则郭妮小说)
- 东天目山(东天目山景区)
- 蝙蝠给人类的一封信(蝙蝠给人类的一封信)
- 大松电饭煲(美的大松电饭煲)
- 服饰加盟(服饰加盟店招商)
- 疯狂填字(疯狂填字5)
- 点对点短信息(点对点短信息费是什么意思)
- 观音普门品(观音普门品念诵全文)
- 河北省大运会(河北省大运会时间)
- 哈利波特官网(哈利波特官网在哪里)
- 骇客神条(骇客神条怎么辨别真假)
- 广州晓港公园(广州晓港公园正门图片)
- 钢筋等级符号(钢筋等级符号电脑怎么输入)
- 常州天宁寺(常州天宁寺求什么灵验)
