在C++中,map
、unordered_map
、set
和 unordered_set
是四种用于存储集合或键值对的关联容器。map
和 set
使用红黑树作为内部数据结构,因此它们的元素是有序的;而 unordered_map
和 unordered_set
使用哈希表作为内部数据结构,因此它们的元素是无序的。
map
map
是一个关联容器,它存储的元素是键值对,键是唯一的,并且按照键的值进行排序。
语法:
cpp复制代码
std::map<Key, T, Compare = std::less<Key>, Allocator = std::allocator<std::pair<const Key, T>>> |
Key
:键的类型。T
:值的类型。Compare
:一个可选的二元谓词,用于比较两个键。默认为std::less<Key>
,即小于操作。Allocator
:用于分配和释放内存的对象。
常用操作:
cpp复制代码
map<int, string> myMap; | |
// 插入元素 | |
myMap.insert(make_pair(1, "one")); | |
myMap[2] = "two"; | |
// 查找元素 | |
if (myMap.find(1) != myMap.end()) { | |
// 键为1的元素存在 | |
} | |
// 遍历元素 | |
for (const auto& pair : myMap) { | |
cout << pair.first << ": " << pair.second << endl; | |
} | |
// 删除元素 | |
myMap.erase(1); |
unordered_map
unordered_map
是一个关联容器,它存储的元素是键值对,键是唯一的,但元素的顺序是随机的。
语法:
cpp复制代码
std::unordered_map<Key, T, Hash = std::hash<Key>, KeyEqual = std::equal_to<Key>, Allocator = std::allocator<std::pair<const Key, T>>> |
Key
:键的类型。T
:值的类型。Hash
:一个哈希函数,用于计算键的哈希值。默认为std::hash<Key>
。KeyEqual
:一个二元谓词,用于比较两个键是否相等。默认为std::equal_to<Key>
。Allocator
:用于分配和释放内存的对象。
常用操作:
cpp复制代码
unordered_map<int, string> myUnorderedMap; | |
// 插入元素 | |
myUnorderedMap.insert(make_pair(1, "one")); | |
myUnorderedMap[2] = "two"; | |
// 查找元素 | |
if (myUnorderedMap.find(1) != myUnorderedMap.end()) { | |
// 键为1的元素存在 | |
} | |
// 遍历元素 | |
for (const auto& pair : myUnorderedMap) { | |
cout << pair.first << ": " << pair.second << endl; | |
} | |
// 删除元素 | |
myUnorderedMap.erase(1); |
set
set
是一个关联容器,它存储的元素是唯一的,并且按照元素的值进行排序。
语法:
cpp复制代码
std::set<Key, Compare = std::less<Key>, Allocator = std::allocator<Key>> |
Key
:元素的类型。Compare
:一个可选的二元谓词,用于比较两个元素。默认为std::less<Key>
,即小于操作。Allocator
:用于分配和释放内存的对象。
常用操作:
cpp复制代码
set<int> mySet; | |
// 插入元素 | |
mySet.insert(1); | |
mySet.emplace(2); | |
// 查找元素 | |
if (mySet.find(1) != mySet.end()) { | |
// 元素1存在 | |
} | |
// 遍历元素 | |
for (const auto& elem : mySet) { | |
cout << elem << " "; | |
} | |
// 删除元素 | |
mySet.erase(1); |
unordered_set
是C++标准库中的一个关联容器,它使用哈希表作为其底层数据结构,因此可以快速地插入、删除和查找元素。unordered_set
中的元素是无序的,且每个元素都是唯一的。
以下是unordered_set
的基本语法:
cpp复制代码
#include <unordered_set> | |
std::unordered_set<Key, Hash = std::hash<Key>, KeyEqual = std::equal_to<Key>, Allocator = std::allocator<Key>> |
Key
:unordered_set
中元素的类型。Hash
:一个哈希函数对象,用于将元素映射到哈希表中的桶。默认是std::hash<Key>
。KeyEqual
:一个二元谓词,用于比较两个元素是否相等。默认是std::equal_to<Key>
。Allocator
:用于分配和释放内存的对象,通常是std::allocator<Key>
。
下面是unordered_set
的一些基本操作和示例:
cpp复制代码
#include <iostream> | |
#include <unordered_set> | |
int main() { | |
// 创建一个unordered_set | |
std::unordered_set<int> mySet; | |
// 插入元素 | |
mySet.insert(10); | |
mySet.insert(20); | |
mySet.insert(30); | |
// 使用emplace插入元素(通常更高效) | |
mySet.emplace(40); | |
// 检查元素是否存在 | |
if (mySet.find(20) != mySet.end()) { | |
std::cout << "20存在于集合中" << std::endl; | |
} | |
// 遍历元素 | |
for (const auto& elem : mySet) { | |
std::cout << elem << " "; | |
} | |
std::cout << std::endl; | |
// 删除元素 | |
mySet.erase(20); | |
// 集合大小 | |
std::cout << "集合的大小:" << mySet.size() << std::endl; | |
// 清空集合 | |
mySet.clear(); | |
return 0; | |
} |
unordered_set
提供了以下一些常用的成员函数:
insert(const value_type& value)
: 插入一个元素。emplace(const args&... args)
: 在容器内构造并插入一个元素。find(const key_type& k)
: 查找键为k的元素。erase(const key_type& k)
: 删除键为k的元素。size() const
: 返回集合中元素的数量。empty() const
: 如果集合为空,则返回true。clear()
: 清空集合中的所有元素。bucket_count() const
: 返回桶的数量。max_bucket_count() const
: 返回可能的最大桶数量。bucket_size(size_type n) const
: 返回第n个桶中的元素数量。bucket(const key_type& k) const
: 返回键为k的元素所在的桶的索引。
要使用unordered_set
,你需要包含头文件<unordered_set>
,并且需要包含命名空间std
或者使用std::
前缀。