set
和 map
容器
在 C++ 中,map 和 set 是两种关联容器,它们提供了基于键的快速查找、插入和删除操作。这两种容器在处理键值对或唯一键的集合时非常有用。
map 和 set 都是基于平衡二叉搜索树(Balanced Binary Search Tree)实现的。具体来说,它们通常使用红黑树(Red-Black Tree)来实现
我整理了下set和map常用的接口
C++ 中的 set
:一种高效的数据结构
在 C++ 中,set
是一种关联容器,它存储唯一的元素,并且元素是按照升序排列的。set
不允许有重复的元素,这使得它非常适合用于存储有序集合或需要保持元素唯一性的场景。
1. set
容器的特性
- 唯一性:
set
中的元素必须是唯一的。 - 有序性:
set
中的元素是按照键的值进行排序的。 - 高效查找:
set
提供高效的查找操作,平均时间复杂度为 O(log n)。 - 迭代器支持:
set
支持迭代器,可以遍历所有元素。
2. set
接口
使用set
的时候要包含头文件#includ <set>
set
的初始化:
set只存储一个键(key)所以其定义如下:
#include <set>
std::set<int> A;//即定义一个空的set,名字是A
Begin
和 End
遍历
- begin: 返回指向
set
中第一个元素的迭代器。auto it = A.begin();
- end: 返回指向
set
末尾的迭代器。auto it = A.end();
Insert
插入
- insert:向set中插入值,特别点就是如果插入的元素已经存在于 set 中,则返回一个指向该元素的迭代器;否则,插入元素并返回一个指向新插入元素的迭代器。如果插入操作成功,返回的迭代器指向新插入的元素,并且布尔值 true;如果插入操作失败(例如,由于内存分配失败),返回的迭代器指向 set 的末尾,并且布尔值为 false。
A.insert(1);
A.insert(A.begin(), 1);
A.insert(1, 3);//插入1,2,3
Find
查找
- find:使用
find
函数查找元素。如果元素存在,返回指向该元素的迭代器;否则返回set
的结束迭代器。
auto it = A.find(3);
if (it != A.end())
{
cout << "Found" << endl;
}
else
{
cout << "Not Found" << endl;
}
Erase
删除
erase: 从
set
中删除一个或多个元素。可以删除单个元素、一组元素或所有元素。删除单个元素:
A.erase(3); // 删除所有值为3的元素
删除指定位置的元素
auto it = A.find(3); if (it != A.end()) { A.erase(it); // 删除找到的第一个值为3的元素 }
删除一组元素:
A.erase(A.begin(), A.end()); // 删除所有元素
Size
获取大小
- size: 返回
set
中元素的数量。int size = A.size();
Empty
判断是否为空
- empty: 如果
set
为空,返回true
;否则返回false
。bool empty = A.empty();
Clear
清空所有元素
- clear: 清空
set
中的所有元素。A.clear();
3. set
容器的应用场景
- 排序集合:存储需要排序的元素。
- 唯一性集合:存储不重复的元素。
- 查找集合:快速查找元素。
C++ 中的 map
:一种高效的关联容器
在 C++ 中,map
是一种关联容器,它存储键值对,其中键是唯一的,用于唯一地标识每个元素,而值可以是重复的。map
中的元素是按照键的升序排列的。
1. map
容器的特性
- 唯一性:
map
中的键必须是唯一的。 - 有序性:
map
中的键值对是按照键的值进行排序的。 - 高效查找:
map
提供高效的查找操作,平均时间复杂度为 O(log n)。 - 迭代器支持:
map
支持迭代器,可以遍历所有元素。
2. map
接口
map
的初始化
#include <map>
std::map<int, std::string> myMap; // 定义一个map,键是int,值是string
Begin
和 End
遍历
for (const auto& pair : myMap) {
std::cout << pair.first << ": " << pair.second << std::endl;
}
Insert
插入
myMap.insert(std::make_pair(1, "one"));
myMap.insert({2, "two"});
myMap.insert({3, "three"}, {4, "four"});
Find
查找
auto it = myMap.find(2);
if (it != myMap.end()) {
std::cout << "Found: " << it->first << ": " << it->second << std::endl;
} else {
std::cout << "Not found." << std::endl;
}
Erase
删除
myMap.erase(2); // 删除键为2的元素
myMap.erase(myMap.begin(), myMap.end()); // 删除所有元素
Size
获取大小
int size = myMap.size();
Empty
判断是否为空
bool empty = myMap.empty();
Clear
清空所有元素
myMap.clear();
3. map
容器的应用场景
- 字典或索引:
map
容器非常适合用于实现字典或索引,其中键用于快速定位值。例如,你可以使用map
来存储单词和它们的定义。 - 数据库索引:在数据库应用中,
map
可以用来存储索引,以便快速查找数据。 - 自动完成或建议:当你输入一个词的起始字母时,
map
可以用来提供可能的单词建议。 - 优先队列:
map
可以用来实现优先队列,其中键是优先级,值是相关数据。