📜  C++ STL中的unordered_set运算符(1)

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

C++ STL中unordered_set运算符介绍

概述

unordered_set是STL中的一个常用容器,是一个元素唯一、无序的集合。在unordered_set中,各个元素的位置是通过哈希函数计算得到的,因此unordered_set的查找、插入、删除等操作的时间复杂度都是常数级别的。

unordered_set除了支持常规的迭代器操作、大小操作、查找操作、插入操作、删除操作等,还有自带的各种运算符操作,包括比较运算符、集合运算符等。

本篇介绍unordered_set运算符的用法及示例。

描述

unordered_set的运算符操作主要有以下几种:

  1. 比较运算符:==和!=
  2. 集合运算符:-(差集)、&(交集)、|(并集)

这些运算符都可以直接用于unordered_set对象,也可以用于unordered_set对象和另一个容器对象之间的运算。

代码示例
1. 比较运算符

比较运算符用于判断两个unordered_set对象是否相等。

代码示例1-1:判断两个unordered_set对象是否相等

#include <iostream>
#include <unordered_set>

int main()
{
    std::unordered_set<int> set1 {1, 2, 3, 4};
    std::unordered_set<int> set2 {1, 2, 3, 5};
    std::unordered_set<int> set3 {1, 2, 3, 4};

    std::cout << "Set1 == Set2 : " << (set1 == set2) << std::endl;  // false
    std::cout << "Set1 == Set3 : " << (set1 == set3) << std::endl;  // true

    return 0;
}

说明:

通过比较运算符==可以判断两个unordered_set对象是否相等,其返回值为bool类型。

运行结果:

Set1 == Set2 : 0
Set1 == Set3 : 1
2. 集合运算符

集合运算符用于对unordered_set对象进行集合运算,包括差集、交集、并集。

代码示例2-1:获取两个unordered_set对象的并集

#include <iostream>
#include <unordered_set>

int main()
{
    std::unordered_set<int> set1 {1, 2, 3, 4};
    std::unordered_set<int> set2 {3, 4, 5, 6};
    std::unordered_set<int> result;

    std::set_union(set1.begin(), set1.end(), set2.begin(), set2.end(), std::inserter(result, result.begin()));

    std::cout << "Set1 : ";
    for (auto it = set1.begin(); it != set1.end(); it++) {
        std::cout << *it << " ";
    }
    std::cout << std::endl;

    std::cout << "Set2 : ";
    for (auto it = set2.begin(); it != set2.end(); it++) {
        std::cout << *it << " ";
    }
    std::cout << std::endl;

    std::cout << "Result : ";
    for (auto it = result.begin(); it != result.end(); it++) {
        std::cout << *it << " ";
    }
    std::cout << std::endl;

    return 0;
}

说明:

使用std::set_union函数,将set1和set2的并集存放到result中。

运行结果:

Set1 : 1 2 3 4
Set2 : 3 4 5 6
Result : 1 2 3 4 5 6

代码示例2-2:获取两个unordered_set对象的交集

#include <iostream>
#include <unordered_set>

int main()
{
    std::unordered_set<int> set1 {1, 2, 3, 4};
    std::unordered_set<int> set2 {3, 4, 5, 6};
    std::unordered_set<int> result;

    std::set_intersection(set1.begin(), set1.end(), set2.begin(), set2.end(), std::inserter(result, result.begin()));

    std::cout << "Set1 : ";
    for (auto it = set1.begin(); it != set1.end(); it++) {
        std::cout << *it << " ";
    }
    std::cout << std::endl;

    std::cout << "Set2 : ";
    for (auto it = set2.begin(); it != set2.end(); it++) {
        std::cout << *it << " ";
    }
    std::cout << std::endl;

    std::cout << "Result : ";
    for (auto it = result.begin(); it != result.end(); it++) {
        std::cout << *it << " ";
    }
    std::cout << std::endl;

    return 0;
}

说明:

使用std::set_intersection函数,将set1和set2的交集存放到result中。

运行结果:

Set1 : 1 2 3 4
Set2 : 3 4 5 6
Result : 3 4

代码示例2-3:获取两个unordered_set对象的差集

#include <iostream>
#include <unordered_set>

int main()
{
    std::unordered_set<int> set1 {1, 2, 3, 4};
    std::unordered_set<int> set2 {3, 4, 5, 6};
    std::unordered_set<int> result;

    std::set_difference(set1.begin(), set1.end(), set2.begin(), set2.end(), std::inserter(result, result.begin()));

    std::cout << "Set1 : ";
    for (auto it = set1.begin(); it != set1.end(); it++) {
        std::cout << *it << " ";
    }
    std::cout << std::endl;

    std::cout << "Set2 : ";
    for (auto it = set2.begin(); it != set2.end(); it++) {
        std::cout << *it << " ";
    }
    std::cout << std::endl;

    std::cout << "Result : ";
    for (auto it = result.begin(); it != result.end(); it++) {
        std::cout << *it << " ";
    }
    std::cout << std::endl;

    return 0;
}

说明:

使用std::set_difference函数,将set1和set2的差集存放到result中。

运行结果:

Set1 : 1 2 3 4
Set2 : 3 4 5 6
Result : 1 2
总结

unordered_set是STL中常用的容器之一,提供了丰富的运算符操作,包括比较运算符、集合运算符等。

在使用unordered_set时,要注意其元素的唯一性以及无序性,尽可能使用哈希函数,以提高性能。同时,要熟练掌握unordered_set的各种运算符操作,以方便开发。