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

📅  最后修改于: 2023-12-03 14:59:46.719000             🧑  作者: Mango

C++ STL中的set vs unordered_set

在C++中,STL(Standard Template Library)是一组数据结构和算法的实现。set和unordered_set是STL中两种常用的数据结构。它们都是基于哈希表实现的集合容器,但是它们在实现和特性方面有所不同。本文将对这两种容器进行介绍和比较。

set容器

set是一种使用红黑树进行实现的有序集合容器。在set中插入元素时,它会自动进行排序,因此它的元素是有序的。由于底层是使用二叉搜索树实现的,因此它具有以下特征:

  • set中的元素是唯一的,重复的元素会被自动忽略。
  • set中的元素是有序的,即它们按照某种规则排列,我们可以使用begin()和end()函数获取set中的首尾迭代器。
  • set是一个有序容器,因此查找元素的速度比较快,时间复杂度为O(logN)。
  • set中的元素不能直接访问和修改,如果想要访问和修改set中某个元素,需要使用迭代器来进行操作。
  • set支持插入、删除、查找等常用操作。

以下是set容器的简单用法:

#include <iostream>
#include <set>
using namespace std;

int main()
{
    set<int> s;

    // 插入元素
    s.insert(3);
    s.insert(1);
    s.insert(5);

    // 打印元素
    for (auto x : s)
        cout << x << " ";
    // 输出:1 3 5

    // 查找元素
    if (s.find(3) != s.end())
        cout << "3 is found" << endl;
    // 输出:3 is found

    // 删除元素
    s.erase(3);

    // 打印元素
    for (auto x : s)
        cout << x << " ";
    // 输出:1 5

    return 0;
}
unordered_set容器

与set不同,unordered_set是一种使用哈希表进行实现的无序集合容器。在unordered_set中插入元素时,它不会自动进行排序,因此它的元素是无序的。由于底层是使用哈希表实现的,因此它具有以下特征:

  • unordered_set中的元素是唯一的,重复的元素会被自动忽略。
  • unordered_set中的元素是无序的,即它们没有按照某种规则排列。
  • unordered_set是一个无序容器,因此查找元素的速度比较快,时间复杂度为O(1)。
  • unordered_set中的元素可以直接访问和修改,不需要使用迭代器。
  • unordered_set支持插入、删除、查找等常用操作。

以下是unordered_set容器的简单用法:

#include <iostream>
#include <unordered_set>
using namespace std;

int main()
{
    unordered_set<int> s;

    // 插入元素
    s.insert(3);
    s.insert(1);
    s.insert(5);

    // 打印元素
    for (auto x : s)
        cout << x << " ";
    // 输出:1 3 5(与插入顺序无关)

    // 查找元素
    if (s.find(3) != s.end())
        cout << "3 is found" << endl;
    // 输出:3 is found

    // 删除元素
    s.erase(3);

    // 打印元素
    for (auto x : s)
        cout << x << " ";
    // 输出:1 5

    return 0;
}
比较

set和unordered_set的选择取决于具体的应用场景。如果需要按照某种规则对元素进行排序,或者需要迭代器来访问和修改元素,那么set是一个更好的选择。如果不要求元素有序,需要快速查找元素,则unordered_set是一个更好的选择。

以下是set和unordered_set的比较:

| 功能比较 | set | unordered_set | | ---------- | ---- | ------------- | | 底层实现 | 红黑树 | 哈希表 | | 容器类型 | 有序容器 | 无序容器 | | 元素排序 | 元素有序 | 元素无序 | | 查找速度 | O(logN) | O(1) | | 访问速度 | O(logN) | O(1) | | 插入和删除速度 | O(logN) | O(1) | | 内存占用 | 比unordered_set大 | 比set小 | | 插入时重复元素处理 | 自动忽略 | 自动忽略 | | 元素访问和修改 | 需要使用迭代器 | 不需要使用迭代器 |

总结

在C++ STL中,set和unordered_set都是常用的集合容器。它们都基于哈希表实现,但在元素的排序、查找速度、访问和修改、内存占用等方面有所不同。在选择使用哪种容器时,需要根据具体的应用场景进行选择。