C++ 关联容器篇:multiset
AI 概述
multiset 是 STL 中的关联容器,用于存储有序且允许重复元素的集合。其特点包括:元素自动排序(默认按<运算符,可自定义),基于红黑树,操作时间复杂度为 O(log n)。定义时需包含头文件,可默认构造、用初始化列表或复制构造,还能指定比较器。常用操作有插入、查找(find、count、equal_range)、删除(erase、clear)及通过迭代器访问元素。在需要存储有序且允许重复元素的业务场景中,multiset 是合适的选择。
目录

multiset是 STL 中的一个关联容器,用于存储元素的集合。它跟 set 不一样,multiset可以存储重复的元素,所以在需要保持元素的有序性并且希望允许重复值时,咱们可以使用multiset。
基本特点
- 有序性:
multiset中的元素是自动排序的,它默认情况下是按照元素的 < 运算符进行排序。当然咱们可以自定义排序。 - 允许重复:它与
set不同,允许相同的元素出现多次。 - 红黑树:它的数据结构基于红黑树,插入、删除和搜索操作的对数时间复杂度 O(log n)。
定义和初始化
咱们在要使用 multiset 时,需要包含头文件:
#include <set>
举个例子,定义和初始化 multiset:
#include<iostream>
#include <set>
int main() {
// 默认构造
std::multiset<int> ms1;
// 使用初始化列表
std::multiset<int> ms2 = {1, 2, 3, 4, 5};
// 复制构造
std::multiset<int> ms3(ms2);
// 指定比较器的 multiset
std::multiset<int, std::greater<int>> ms4; // 按降序排序
return 0;
}
常用操作
1.插入元素
ms1.insert(10); // 插入一个元素 ms1.insert(20); ms1.insert(10); // 插入重复元素
2. 查找元素
multiset 的三种常用查找方法:
- find: 返回迭代器指向第一个匹配的元素,若未找到则返回
end()。auto it = ms1.find(10); if (it != ms1.end()) { std::cout << "Found: " << *it << std::endl; } - count: 返回某个元素的出现次数。
int count = ms1.count(10); // 返回 2,因为 10 被插入了两次
- equal_range: 返回一个范围,包含所有匹配的元素。
auto range = ms1.equal_range(10); for (auto iter = range.first; iter != range.second; ++iter) { std::cout << *iter << " "; }
3. 删除元素
- erase: 可以通过值、迭代器或范围来删除元素。
ms1.erase(10); // 删除首个匹配的 10 ms1.erase(ms1.find(20)); // 通过迭代器删除
- clear: 移除所有元素。
ms1.clear();
4. 访问元素
通过迭代器访问元素。
for (const auto& elem : ms1) {
std::cout << elem << " ";
}
我举了一个完整的示例,看下 multiset 的基本用法:
#include<iostream>
#include <set>
int main() {
std::multiset<int> ms;
// 插入元素
ms.insert(5);
ms.insert(1);
ms.insert(3);
ms.insert(1); // 插入重复元素
ms.insert(2);
// 输出元素
std::cout << "Multiset elements: ";
for (const auto& elem : ms) {
std::cout << elem << " ";
}
std::cout << std::endl;
// 查找元素
std::cout << "Count of 1: " << ms.count(1) << std::endl;
// 删除元素
ms.erase(1); // 删除一个 1
std::cout << "After removing one '1': ";
for (const auto& elem : ms) {
std::cout << elem << " ";
}
std::cout << std::endl;
// 使用 equal_range 查找
auto range = ms.equal_range(1);
std::cout << "Elements equal to 1: ";
for (auto it = range.first; it != range.second; ++it) {
std::cout << *it << " ";
}
std::cout << std::endl;
return 0;
}
在平常开发过程中,可以根据自己业务逻辑需要,如果需要存储有序集合且允许重复元素的场景,可以选择multiset。
以上关于C++ 关联容器篇:multiset的文章就介绍到这了,更多相关内容请搜索码云笔记以前的文章或继续浏览下面的相关文章,希望大家以后多多支持码云笔记。
声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权/违法违规/事实不符,请将相关资料发送至 admin@mybj123.com 进行投诉反馈,一经查实,立即处理!
重要:如软件存在付费、会员、充值等,均属软件开发者或所属公司行为,与本站无关,网友需自行判断
码云笔记 » C++ 关联容器篇:multiset
如若内容造成侵权/违法违规/事实不符,请将相关资料发送至 admin@mybj123.com 进行投诉反馈,一经查实,立即处理!
重要:如软件存在付费、会员、充值等,均属软件开发者或所属公司行为,与本站无关,网友需自行判断
码云笔记 » C++ 关联容器篇:multiset
微信
支付宝