unordered_set

时间:2024-10-18 10:22:34

无序集合unordered_set 是C++标准模板库(STL)中的一个关联容器,用于存储唯一的元素,并以哈希表为底层实现。它与set的主要区别在于元素的存储顺序:unordered_set无序的,依赖于哈希表来快速查找、插入和删除元素。
无序集合unordered_set的几个性质:

  • 无序性:元素按照哈希表的方式存储,而不是按照插入顺序或大小顺序;迭代遍历时,元素输出顺序是不确定的。
  • 唯一性:unordered_set 中不允许有重复的元素。如果尝试插入已经存在的元素,新插入的操作将无效,且原来的元素不会被更改。
  • 高效性:查找、插入、删除的平均时间复杂度是O(1),但是在最坏的情况下(严重哈希冲突),时间复杂度会达到O(n)
  • 元素不可改:插入的元素不能在集合中修改,如果想修改得先删除再插入新元素。
常用方法
  1. size()empty():用于获取大小和集合是否为空
  2. insert()erase():用于插入和删除元素
  3. find():用于查找值(unordered_set中的元素既是值也是键,有别于unordered_map
测试用例
#include <iostream>
#include <unordered_set>

using namespace std;

int main(int argc, char const *argv[])
{
    unordered_set<string> stringset;

    // 插入元素
    stringset.insert("this");
    stringset.insert("is");
    stringset.insert("a");
    stringset.insert("C++");
    stringset.insert("demo");

    // 判断集合是否为空
    if (stringset.empty())
    {
        cout << "无序集合为空" << endl;
        return -1;
    }
    else  // 不为空则输出集合大小
    {
        cout << "集合的大小是:" << stringset.size() << endl;
    }

    // 查找
    if (stringset.find("C+") != stringset.end())
    {
        cout << "找到了对应的元素" << endl;
    }
    else
    {
        cout << "没有找到对应的元素" << endl;
    }

    stringset.insert("demo");  // 无法重复插入
    stringset.insert("demo1");  // 成功插入

    cout << "集合的大小是:" << stringset.size() << endl;

    // 遍历元素
    unordered_set<string>::iterator itr;
    for (itr = stringset.begin(); itr != stringset.end(); itr++)
    {
        cout << (*itr) << " ";
    }
    cout << endl;

    return 0;
}