C++集合容器 set
与 multiset
的详细用法与区别
在C++中,set
和 multiset
都是STL(标准模板库)提供的关联容器,常用于存储和管理一组有序的数据。它们的核心区别在于元素的唯一性。虽然二者都遵循红黑树的结构,使得数据可以自动排序并且查找、插入、删除的时间复杂度为 O(log n)
,但它们在处理重复元素时有着不同的行为。
本文将详细介绍这两种容器的用法和它们的主要区别。
一、set
容器
1. 概述
set
是一个存储唯一元素的集合,其中的每个元素都是唯一的,且会自动按照指定的顺序(默认情况下是升序)排列。当插入元素时,set
会自动去重,即如果插入的元素已存在于集合中,则不会再次插入。
2. 常用操作
- 插入元素:
insert()
函数用于插入元素。 - 查找元素:
find()
函数用于查找某个元素是否存在。 - 删除元素:
erase()
函数用于删除指定的元素。 - 遍历元素:可以使用迭代器来遍历
set
容器中的元素。
3. 代码示例
#include <iostream>
#include <set>
int main() {
std::set<int> s;
// 插入元素
s.insert(5);
s.insert(1);
s.insert(3);
s.insert(5); // 重复的元素不会插入
// 遍历集合
for (int num : s) {
std::cout << num << " ";
}
std::cout << std::endl;
// 查找元素
if (s.find(3) != s.end()) {
std::cout << "3 found in the set!" << std::endl;
}
// 删除元素
s.erase(1);
// 遍历删除后的集合
for (int num : s) {
std::cout << num << " ";
}
std::cout << std::endl;
return 0;
}
4. 输出结果
1 3 5
3 found in the set!
3 5
5. 总结
set
中的每个元素是唯一的,并且按照升序排列。- 在插入时,如果元素已存在,插入操作不会成功。
- 适用于需要去重并且按顺序访问元素的场景。
二、multiset
容器
1. 概述
multiset
与 set
类似,不同之处在于允许重复元素。也就是说,multiset
可以包含多个相同的元素,这使得它适用于需要存储重复元素的场景。
2. 常用操作
- 插入元素:
insert()
函数用于插入元素,可以插入重复的元素。 - 查找元素:
find()
函数用于查找元素,但返回的是指向该元素的迭代器。 - 删除元素:
erase()
函数用于删除指定的元素,可以删除单个元素或所有匹配的元素。 - 遍历元素:可以使用迭代器来遍历
multiset
容器中的元素。
3. 代码示例
#include <iostream>
#include <set>
int main() {
std::multiset<int> ms;
// 插入元素,包括重复元素
ms.insert(5);
ms.insert(1);
ms.insert(3);
ms.insert(5); // 重复元素也会被插入
// 遍历集合
for (int num : ms) {
std::cout << num << " ";
}
std::cout << std::endl;
// 查找元素
if (ms.find(3) != ms.end()) {
std::cout << "3 found in the multiset!" << std::endl;
}
// 删除元素
ms.erase(5); // 删除所有值为5的元素
// 遍历删除后的集合
for (int num : ms) {
std::cout << num << " ";
}
std::cout << std::endl;
return 0;
}
4. 输出结果
1 3 5 5
3 found in the multiset!
1 3
5. 总结
multiset
允许重复的元素存在。- 插入重复元素时,
multiset
会保留每个元素的出现次数。 - 适用于需要存储重复元素并且按顺序访问的场景。
三、set
与 multiset
的区别
特性 | set | multiset |
---|---|---|
元素唯一性 | 不允许重复元素 | 允许重复元素 |
插入操作 | 插入相同的元素会被忽略 | 允许插入多个相同的元素 |
排序方式 | 元素自动排序(默认升序) | 元素自动排序(默认升序) |
元素查找 | 查找某个元素是否存在 | 查找某个元素是否存在 |
删除操作 | 删除单个元素 | 可以删除所有相同元素或单个元素 |
1. 元素唯一性:
set
中的每个元素是唯一的,插入重复的元素会被自动忽略。multiset
允许重复元素,多个相同的元素可以同时存在。
2. 插入操作:
set
会自动去重,因此插入重复元素时不会进行插入。multiset
允许多个相同的元素存在,所以重复插入相同元素不会被拒绝。
3. 适用场景:
set
:适用于需要去重的场景,例如存储唯一的ID,集合运算等。multiset
:适用于需要统计元素出现次数的场景,例如频率统计、词频分析等。
四、实战应用场景
统计单词出现频率:
- 使用
multiset
存储单词,可以轻松统计每个单词出现的次数,适用于文本分析、日志处理等场景。 - 使用
set
可以快速去重,避免重复存储相同元素。
- 使用
集合运算:
- 如果需要快速判断两个集合是否有相同元素并去重,
set
是理想的选择。 multiset
则可以在涉及频率统计时更加高效。
- 如果需要快速判断两个集合是否有相同元素并去重,
五、总结
set
和multiset
都是有序集合容器,提供了插入、查找、删除等基本操作。- 主要区别在于元素的唯一性:
set
不允许重复元素,而multiset
允许重复元素。 - 根据实际需求选择合适的容器:当需要去重时使用
set
,当需要存储重复元素并且按顺序访问时使用multiset
。