#include<set>的用法(自用)

 是 C++ 标准库中的一个头文件,提供了 std::set 容器的实现。std::set 是一个关联容器,用于存储唯一元素的集合,元素按特定顺序(默认是升序)排列。以下是关于  和 std::set 的详细讲解:


1. std::set 的特点

  • 唯一性std::set 中的元素是唯一的,不允许重复。

  • 有序性:元素默认按升序排列(可以通过自定义比较函数改变顺序)。

  • 底层实现:通常基于红黑树(一种平衡二叉搜索树),因此插入、删除和查找操作的时间复杂度均为 O(log⁡n)O(logn)。

  • 不可修改元素std::set 中的元素是常量,不能直接修改(必须先删除再插入)。


2. std::set 的常用操作

2.1 包含头文件

#include 

2.2 定义 std::set

std::set mySet;  // 定义一个存储 int 类型的 set

2.3 插入元素

mySet.insert(10);  // 插入元素 10
mySet.insert(20);  // 插入元素 20
mySet.insert(10);  // 重复插入 10,不会生效

2.4 删除元素

mySet.erase(10);  // 删除元素 10

2.5 查找元素

auto it = mySet.find(20);  // 查找元素 20
if (it != mySet.end()) {
    std::cout << "Element found: " << *it << std::endl;
} else {
    std::cout << "Element not found." << std::endl;
}

2.6 遍历元素

for (const auto &element : mySet) {
    std::cout << element << " ";
}

2.7 获取大小

std::cout << "Size of set: " << mySet.size() << std::endl;

2.8 检查是否为空

if (mySet.empty()) {
    std::cout << "Set is empty." << std::endl;
} else {
    std::cout << "Set is not empty." << std::endl;
}

2.9 清空集合

mySet.clear();  // 清空所有元素

3. 自定义排序规则

std::set 默认按升序排列元素,但可以通过自定义比较函数改变排序规则。

3.1 使用函数对象

struct Compare {
    bool operator()(int a, int b) const {
        return a > b;  // 降序排列
    }
};

std::set mySet;  // 使用自定义比较函数

3.2 使用 Lambda 表达式

auto compare = [](int a, int b) { return a > b; };
std::set mySet(compare);  // 使用 Lambda 表达式

4. std::set 的应用场景

  • 去重:快速去除重复元素。

  • 排序:自动维护有序集合。

  • 查找:快速查找元素是否存在。

  • 统计:统计唯一元素的数量。


5. 示例代码

以下是一个完整的示例,展示 std::set 的基本用法:

#include 
#include 

int main() {
    std::set mySet;

    // 插入元素
    mySet.insert(30);
    mySet.insert(10);
    mySet.insert(20);
    mySet.insert(10);  // 重复插入,不会生效

    // 遍历元素
    std::cout << "Elements in set: ";
    for (const auto &element : mySet) {
        std::cout << element << " ";  // 输出:10 20 30
    }
    std::cout << std::endl;

    // 查找元素
    auto it = mySet.find(20);
    if (it != mySet.end()) {
        std::cout << "Element 20 found." << std::endl;
    } else {
        std::cout << "Element 20 not found." << std::endl;
    }

    // 删除元素
    mySet.erase(20);
    std::cout << "After erasing 20, elements in set: ";
    for (const auto &element : mySet) {
        std::cout << element << " ";  // 输出:10 30
    }
    std::cout << std::endl;

    // 获取大小
    std::cout << "Size of set: " << mySet.size() << std::endl;  // 输出:2

    // 清空集合
    mySet.clear();
    std::cout << "After clearing, is set empty? " << (mySet.empty() ? "Yes" : "No") << std::endl;  // 输出:Yes

    return 0;
}

6. std::set 的优缺点

优点

  • 自动去重和排序。

  • 查找、插入、删除操作的时间复杂度为 O(log⁡n)O(logn)。

缺点

  • 元素不可直接修改。

  • 内存占用较高(由于红黑树的实现)。

你可能感兴趣的:(c++,算法,数据结构)