C++ 面试题 目录

C++ 中 set 和 unordered_set 的区别是什么?

推荐答案

在C++中,setunordered_set 是两种不同的关联容器,它们的主要区别在于底层实现和性能特性。

  • set:基于红黑树实现,元素按顺序存储,支持有序遍历。插入、删除和查找操作的时间复杂度为 O(log n)。
  • unordered_set:基于哈希表实现,元素无序存储,插入、删除和查找操作的平均时间复杂度为 O(1),但在最坏情况下可能退化为 O(n)。

本题详细解读

1. 底层实现

  • setset 是基于红黑树(一种自平衡二叉搜索树)实现的。红黑树保证了元素的有序性,因此 set 中的元素总是按照某种顺序(默认是升序)排列。
  • unordered_setunordered_set 是基于哈希表实现的。哈希表通过哈希函数将元素映射到不同的桶中,因此元素在容器中的存储是无序的。

2. 性能特性

  • set

    • 插入:由于红黑树的平衡性,插入操作的时间复杂度为 O(log n)。
    • 删除:删除操作的时间复杂度同样为 O(log n)。
    • 查找:查找操作的时间复杂度为 O(log n)。
    • 遍历:由于元素是有序的,遍历时可以按照顺序访问元素。
  • unordered_set

    • 插入:在哈希表中,插入操作的平均时间复杂度为 O(1),但在哈希冲突较多的情况下,可能退化为 O(n)。
    • 删除:删除操作的平均时间复杂度为 O(1),同样可能退化为 O(n)。
    • 查找:查找操作的平均时间复杂度为 O(1),最坏情况下为 O(n)。
    • 遍历:由于元素是无序的,遍历时元素的顺序是不确定的。

3. 使用场景

  • set:适用于需要有序存储和快速查找、插入、删除的场景,尤其是当元素需要按顺序访问时。
  • unordered_set:适用于需要快速查找、插入、删除且不关心元素顺序的场景,尤其是当元素数量较大且哈希函数设计良好时。

4. 内存占用

  • set:由于红黑树的节点结构较为复杂,set 的内存占用通常比 unordered_set 高。
  • unordered_set:哈希表的内存占用相对较低,但在哈希冲突较多时,可能需要额外的内存来处理冲突。

5. 其他特性

  • set:支持双向迭代器,可以向前和向后遍历元素。
  • unordered_set:仅支持单向迭代器,只能向前遍历元素。

通过以上分析,可以根据具体需求选择合适的容器。如果需要有序存储和遍历,选择 set;如果需要更快的查找、插入和删除操作,并且不关心元素顺序,选择 unordered_set

纠错
反馈