0

0

C++ STL multiset和set有何不同 分析允许重复元素的关联容器

P粉602998670

P粉602998670

发布时间:2025-08-22 10:25:01

|

264人浏览过

|

来源于php中文网

原创

set和multiset的核心区别在于元素唯一性:1.set不允许重复元素,插入相同值时第二个会被忽略;2.multiset允许重复值存在,所有插入都会保留。此外,插入操作返回类型不同:set的insert()返回pair,而multiset只返回iterator。删除操作也不同:set用erase(value)删除唯一元素,multiset用erase(value)则删除所有相同元素,若要删一个需传迭代器。查找行为方面:set的find()返回唯一元素,multiset可能返回多个,常用equal_range(key)获取相同值的范围。适用场景:set适用于存储唯一键,multiset适用于频率统计、排行榜等需重复元素的场景。

C++ STL multiset和set有何不同 分析允许重复元素的关联容器

在C++标准库中,

set
multiset
都属于关联容器,底层通常由红黑树实现,支持自动排序。它们的核心区别在于:
set
不允许重复元素,而
multiset
允许重复值存在

C++ STL multiset和set有何不同 分析允许重复元素的关联容器

如果你需要一个能自动排序并且允许重复键的数据结构,那么

multiset
就是更合适的选择。

C++ STL multiset和set有何不同 分析允许重复元素的关联容器

元素唯一性:set不允许重复,multiset可以

这是两者最根本的区别:

立即学习C++免费学习笔记(深入)”;

  • set
    插入两个相同的值,第二个会被忽略。
  • multiset
    则会保留两个相同的值。

例如:

C++ STL multiset和set有何不同 分析允许重复元素的关联容器
std::set s;
s.insert(5);
s.insert(5);
// s.size() == 1

std::multiset ms;
ms.insert(5);
ms.insert(5);
// ms.size() == 2

所以在处理频率统计、排行榜等场景时,

multiset
更实用。


插入与删除操作略有不同

虽然两者都有

insert()
erase()
方法,但使用方式上有些细节需要注意:

Videoleap
Videoleap

Videoleap是一个一体化的视频编辑平台

下载
  • set
    insert()
    返回的是一个
    pair
    ,bool表示是否插入成功(因为不能重复)。
  • multiset
    insert()
    只返回一个
    iterator
    ,因为总是可以插入。

删除方面也有差异:

  • set
    erase(value)
    会删除唯一的那个元素(如果存在的话)。
  • multiset
    erase(value)
    会删除所有等于该值的元素。

如果你只想删掉一个特定值的实例,应该传迭代器进去:

auto it = ms.find(5);
if (it != ms.end()) {
    ms.erase(it); // 只删一个
}

查找操作的行为也有所不同

查找元素时,

set
找到的就是唯一的那个;而
multiset
可能有多个相同元素。

常用的方法包括:

  • find()
    :返回第一个匹配的元素。
  • count(key)
    :返回有多少个相同值的元素。
  • equal_range(key)
    :返回一对迭代器,表示所有等于key的元素范围。

举个例子:

std::multiset ms = {3, 5, 5, 7};
auto range = ms.equal_range(5);
for (auto it = range.first; it != range.second; ++it) {
    std::cout << *it << " ";
}
// 输出:5 5

这个功能在做区间查找或批量处理时非常有用。


总结一下适用场景

  • 如果你希望存储唯一值,并且每个值只能出现一次,就选
    set
  • 如果你需要支持重复元素、统计频率、维护有序列表但又不想自己排序,就用
    multiset

基本上就这些区别。选择哪个容器取决于你的具体需求。

相关专题

更多
counta和count的区别
counta和count的区别

Count函数用于计算指定范围内数字的个数,而CountA函数用于计算指定范围内非空单元格的个数。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

193

2023.11.20

counta和count的区别
counta和count的区别

Count函数用于计算指定范围内数字的个数,而CountA函数用于计算指定范围内非空单元格的个数。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

193

2023.11.20

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

312

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

522

2024.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

48

2025.08.29

C++中int的含义
C++中int的含义

本专题整合了C++中int相关内容,阅读专题下面的文章了解更多详细内容。

190

2025.08.29

treenode的用法
treenode的用法

​在计算机编程领域,TreeNode是一种常见的数据结构,通常用于构建树形结构。在不同的编程语言中,TreeNode可能有不同的实现方式和用法,通常用于表示树的节点信息。更多关于treenode相关问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

529

2023.12.01

C++ 高效算法与数据结构
C++ 高效算法与数据结构

本专题讲解 C++ 中常用算法与数据结构的实现与优化,涵盖排序算法(快速排序、归并排序)、查找算法、图算法、动态规划、贪心算法等,并结合实际案例分析如何选择最优算法来提高程序效率。通过深入理解数据结构(链表、树、堆、哈希表等),帮助开发者提升 在复杂应用中的算法设计与性能优化能力。

6

2025.12.22

php源码安装教程大全
php源码安装教程大全

本专题整合了php源码安装教程,阅读专题下面的文章了解更多详细内容。

7

2025.12.31

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
深入剖析redis教程
深入剖析redis教程

共55课时 | 7.9万人学习

麦子学院深入浅出 redis 视频教程
麦子学院深入浅出 redis 视频教程

共20课时 | 4.4万人学习

传智播客redis基础视频教程
传智播客redis基础视频教程

共13课时 | 5.6万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号