C++之hash映射与集合

​​​​​​C++刷题基础知识(栈、队列、hash、STL、基础函数等)---持续更新-CSDN博客

 1.1 unordered_map

1.1.1 unordered_map的基本特性

C++中的 unordered_map 是一种关联容器,它包含了键值对,并且是无序的。每一个键都是唯一的,与对应的值相关联。unordered_map 在内部使用了哈希表来实现,因此它的插入、删除和查找操作的时间复杂度通常是 O(1)。然而,由于哈希冲突的存在,最坏的情况可能会达到 O(n)。

注意:unordered_map 不保证元素的排序,无论是按照键还是值,由于hash映射函数质量的不同可能会出现两个不同key值映射一样的情况导致桶堆叠。

1.1.2 unordered_map的代码使用例程

#include <iostream>  
#include <unordered_map>  
#include <string>  
  
int main() {  
    std::unordered_map<std::string, int> my_map;  
      
    // 插入键值对  
    my_map["apple"] = 1;  
    my_map["banana"] = 2;  
    my_map["cherry"] = 3;  
      
    // 查找值  
    int value = my_map["apple"]; // value 现在是1  
    std::cout << "The value of apple is: " << value << std::endl;  
      
    // 检查键是否存在  
    if (my_map.find("orange") == my_map.end()) {  
        std::cout << "The map does not contain orange" << std::endl;  
    }  
      
    // 删除键值对  
    my_map.erase("banana");  
      
    // 遍历键值对  (其中first表示键,而second表示值)
    for (const auto& pair : my_map) {  
        std::cout << pair.first << ": " << pair.second << std::endl;  
    }  
      
    return 0;  
}

1.1.3 unordered_map的用法总结(表格)

函数名描述
insert()插入一个或多个键值对
erase()删除一个或多个键值对
find()查找指定键的值,如果找不到则返回尾迭代器
count()返回指定键值的数量
empty()检查容器是否为空
size()返回容器中键值对的数量
clear()删除容器中的所有键值对
swap()与另一个容器交换内容
begin()返回指向第一个键值对的迭代器
end()返回指向尾部的迭代器
cbegin()返回指向第一个键值对的常量迭代器
cend()返回指向尾部的常量迭代器
hash_function()返回用于哈希的函数对象
key_eq()返回用于比较键的函数对象

1.1.4  map与unordered_map的对比

  1. 实现方式:map基于红黑树实现,保持元素有序,插入和查找的时间复杂度是O(log n)。unordered_map基于哈希表实现,不保持元素有序,插入和查找的时间复杂度平均为O(1),但最坏情况下可能会达到O(n)。
  2. 元素顺序:map中的元素按照键的自然顺序(或者通过自定义比较函数)进行排序,所以遍历得到的元素是有序的。unordered_map中的元素没有特定的顺序,遍历得到的元素顺序与插入顺序无关。
  3. 查找效率:map适用于需要有序数据以及频繁查找的场景。unordered_map适用于对插入和查找性能要求较高,对元素顺序无特别要求的场景。
  4. 内存开销:由于map使用红黑树来维护有序性,它的内存开销通常比unordered_map要高。unordered_map使用哈希表,其内存开销通常较低,但在存储大量数据时,由于哈希表冲突可能需要更多内存。
  5. 需要的关键字类型:map要求关键字类型有比较函数或支持<运算符来进行元素排序。unordered_map要求关键字类型支持哈希函数和==运算符。
  6. C++标准要求:map和unordered_map都是C++标准库的一部分,但在C++11之前,只有map是标准库的部分,而unordered_map是在C++11引入的新容器。
  7. 迭代器稳定性:map的迭代器在插入和删除元素时不会失效,因为它使用红黑树来保持顺序。unordered_map的迭代器在插入元素时可能会失效,因为哈希表的重新哈希过程可能导致元素位置改变。

1.2 set

1.2.1 set的基本特性

C++中的set是一种基于红黑树实现的关联容器,它包含了唯一键值的集合。每个键在set中只能出现一次,不能重复。set的元素按照键的升序排列。

1.2.2 set的代码使用例程

#include <iostream>  
#include <set>  
#include <string>  
  
int main() {  
    std::set<std::string> my_set;  
      
    // 插入元素  
    my_set.insert("apple");  
    my_set.insert("banana");  
    my_set.insert("cherry");  
      
    // 查找元素  
    auto it = my_set.find("banana");  
    if (it != my_set.end()) {  
        std::cout << "Found banana" << std::endl;  
    } else {  
        std::cout << "Banana not found" << std::endl;  
    }  
      
    // 删除元素  
    my_set.erase("banana");  
      
    // 遍历元素  
    for (const auto& item : my_set) {  
        std::cout << item << std::endl;  
    }  
      
    return 0;  
}

1.2.3 set的用法总结(表格)

函数名描述
insert()在集合中插入一个或多个元素
erase()删除集合中的一个或多个元素
find()在集合中查找指定的元素,如果找到返回一个指向它的迭代器,否则返回尾迭代器
count()返回集合中等于给定值的元素数量
empty()检查集合是否为空
size()返回集合中元素的数量
clear()删除集合中的所有元素
begin()返回指向第一个元素的迭代器
end()返回指向尾部的迭代器
rbegin()返回指向最后一个元素的反向迭代器
rend()返回指向尾部的反向迭代器

1.3 unordered_set

1.3.1 unordered_set的基本特性

C++的unordered_set是一种基于哈希表实现的关联容器,它包含了唯一键值的集合。每个键在unordered_set中只能出现一次,不能重复。unordered_set的元素按照键的哈希值进行存储,因此它没有特定的顺序。与有序集合(set)不同,unordered_set不保证元素的排序。

1.3.2 unordered_set的代码使用例程

#include <iostream>  
#include <unordered_set>  
#include <string>  
  
int main() {  
    // 创建一个unordered_set对象  
    std::unordered_set<std::string> my_set;  
      
    // 插入元素  
    my_set.insert("apple");  
    my_set.insert("banana");  
    my_set.insert("cherry");  
      
    // 查找元素  
    auto it = my_set.find("banana");  
    if (it != my_set.end()) {  
        std::cout << "Found banana" << std::endl;  
    } else {  
        std::cout << "Banana not found" << std::endl;  
    }  
      
    // 删除元素  
    my_set.erase("banana");  
      
    // 遍历元素  
    for (const auto& item : my_set) {  
        std::cout << item << std::endl;  
    }  
      
    return 0;  
}

1.3.3 unordered_set的用法总结(表格)

函数名描述
insert()在集合中插入一个或多个元素
erase()删除集合中的一个或多个元素
find()在集合中查找指定的元素,如果找到返回一个指向它的迭代器,否则返回尾迭代器
count()返回集合中等于给定值的元素数量
empty()检查集合是否为空
size()返回集合中元素的数量
clear()删除集合中的所有元素
swap()与另一个集合交换内容
begin()返回指向第一个元素的迭代器
end()返回指向尾部的迭代器
cbegin()返回指向第一个元素的常量迭代器
cend()返回指向尾部的常量迭代器
hash_function()返回用于哈希的函数对象
key_eq()返回用于比较键的函数对象

1.4 pair

1.4.1 pair的基本特性

C++的std::pair是一个用于存储两个不同类型对象的容器,这两个对象可以是不同的类型,而且这两个对象在pair中并不是关联的,也就是说它们的类型并没有直接关系。这两个元素分别称为first和second,pair的所有构造函数都保持first和second的值不变。

1.4.2 pair的代码使用例程

#include <iostream>  
#include <utility> // pair在这个头文件中定义  
  
int main() {  
    // 创建一个pair对象  
    std::pair<int, std::string> p1(42, "Hello");  
      
    // 使用first和second成员函数  
    std::cout << "First element: " << p1.first << std::endl;  
    std::cout << "Second element: " << p1.second << std::endl;  
      
    // 使用赋值操作符  
    std::pair<int, std::string> p2;  
    p2 = p1; // 将p1的值赋给p2  
    std::cout << "p2 first element: " << p2.first << std::endl;  
    std::cout << "p2 second element: " << p2.second << std::endl;  
      
    // 使用swap函数交换两个pair的值  
    std::swap(p1, p2);  
    std::cout << "After swap: " << "p1 first element: " << p1.first << ", p1 second element: " << p1.second << std::endl;  
    std::cout << "After swap: " << "p2 first element: " << p2.first << ", p2 second element: " << p2.second << std::endl;  
      
    return 0;  
}

1.4.3 pair的用法总结(表格)

函数名描述
first返回存储在pair中的第一个元素的引用
second返回存储在pair中的第二个元素的引用
operator=对pair的赋值操作符
swap()交换两个pair对象的值

1.5 使用场景及对比

pairunordered_mapsetunordered_set
key:value模式,区别是一个元素或者多个元素value单一元素,区别为是否有序
  • 22
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值