C++中map与unordered_map, set与unordered_set这三者分别的详细语法

在C++中,mapunordered_mapset 和 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>>
  • Keyunordered_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::前缀。

  • 10
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
unordered_setC++标准库的一个容器类,它提供了一种存储唯一元素的无序集合。 unordered_set使用哈希表来实现元素的存储和查找,因此它具有快速的插入、删除和查找操作的特点。通过使用哈希函数,unordered_set可以将元素分布在不同的存储桶,从而实现高效的查找。 在unordered_set,每个元素被视为键值(key),并且它们是唯一的,不能重复。 unordered_set的元素的顺序是不确定的,它们不按照插入的顺序进行存储。 引用提供了一些unordered_set的常用成员函数和迭代器的使用方法。可以使用begin()和end()函数来获取unordered_set的迭代器的起始位置和结束位置。cbegin()和cend()函数返回的是const迭代器,它们不允许修改unordered_set的元素。local_iterator则用于遍历unordered_set某个特定存储桶的元素。 总结来说,unordered_set是一个存储唯一元素的无序集合的容器类,它使用哈希表来实现元素的存储和查找。在使用unordered_set时,可以利用迭代器来访问和操作其的元素。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [C++常用语法——unordered_set](https://blog.csdn.net/LiuXF93/article/details/120899401)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [C++ STL 之 unordered_set 使用(包括unordersd_map)](https://blog.csdn.net/qq_32172673/article/details/85160180)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值