📜  C++ STL中的set vs unordered_set(1)

📅  最后修改于: 2023-12-03 15:13:56.683000             🧑  作者: Mango

STL中的set vs unordered_set

STL提供了两种不同的关联容器:set和unordered_set。本文将介绍这两种容器的区别、如何选择正确的容器以及它们的实现方式。

set和unordered_set的区别

set和unordered_set都是关联容器,它们都可以用于存储一组元素,并支持如下操作:

  • 插入元素
  • 删除元素
  • 查询元素是否存在

不同之处在于它们内部如何组织和访问元素:

  • set是基于红黑树,以元素的顺序进行存储,插入、删除和查找的时间复杂度都是O(log n)。
  • unordered_set是基于哈希表,元素的顺序是无序的,插入、删除和查找的时间复杂度都是期望O(1)。

由于哈希表的实现方式,unordered_set的遍历时间复杂度要比set高,因为遍历哈希表的时候需要计算哈希值,但unordered_set的插入、删除和查找操作在大多数情况下要比set快。

如何选择正确的容器

正确选择set和unordered_set取决于你的具体需求。考虑以下因素:

  • 是否需要遍历元素?如果需要按照元素的顺序进行遍历,那么选择set;如果只需要随机访问元素,那么unordered_set更合适。
  • 元素的数量多少?在元素数量较少的情况下,set的性能可能会更好,因为哈希表需要更多的内存,并且在元素数量少时,红黑树的时间复杂度更优。
  • 元素的类型是否支持哈希函数?unordered_set使用哈希函数来计算元素在哈希表中的位置,如果元素类型不支持哈希函数,那么要自己实现一个哈希函数。
set和unordered_set的实现方式

set和unordered_set的实现方式都是在C++标准库中预定义的。以下是使用set和unordered_set的代码示例:

#include <iostream>
#include <set>
#include <unordered_set>

int main() {
  // set example
  std::set<int> s = {3, 1, 4, 1, 5, 9, 2, 6, 5, 3};
  for (const auto& elem : s) {
    std::cout << elem << " "; // output: 1 2 3 4 5 6 9
  }

  // unordered_set example
  std::unordered_set<int> us = {3, 1, 4, 1, 5, 9, 2, 6, 5, 3};
  for (const auto& elem : us) {
    std::cout << elem << " "; // output: 9 1 4 3 5 6 2
  }

  return 0;
}

上述代码中,set按照元素的顺序输出,而unordered_set的输出顺序是随机的。

总结

set和unordered_set都是C++ STL提供的关联容器,它们的实现方式和适用场景不同。在选择使用哪种容器时,需要考虑元素的顺序、数量和元素类型等因素。在实际应用中,set和unordered_set都是非常有用的容器,可以帮助我们高效地处理数据。