C++ set容器

set 容器中的元素会自动按照升序排列(默认情况下),并且不允许有重复的元素。set 提供了高效的元素查找、插入和删除操作。

唯一性set 中的每个元素都是唯一的,不允许有重复值。

自动排序set 中的元素会根据其值自动排序,默认情况下是按照升序排列。

键-值对:虽然 set 存储的是单一的值(而不是像 map 那样存储键-值对),但它仍然可以看作是基于键(即元素值本身)的集合。

高效查找:由于 set 内部通常使用红黑树实现,查找、插入和删除操作的时间复杂度都是 O(log n)。

引入头文件 

#include <set>

声明和初始化

set<int> mySet;  // 声明一个存储int类型元素的set
set<string> myStringSet{"aa","bb","cc"};  // 声明一个存储string类型元素的set

插入元素 

mySet.insert(10);
mySet.insert(20);
mySet.insert(5);  // 元素会自动排序

遍历元素

// for循环
for (string a: myStringSet) {
    cout<< a <<" ";
}

// 使用迭代器
for (auto it = mySet.begin(); it != mySet.end(); ++it) {
    std::cout << *it << " ";
}

查找元素 

auto it = mySet.find(10);
if (it != mySet.end()) {
    std::cout << "Found 10" << std::endl;
}

删除元素 

mySet.erase(10);  // 删除值为10的元素
auto it = mySet.find(20);
if (it != mySet.end()) {
    mySet.erase(it);  // 使用迭代器删除元素
}

大小和空检查

cout << "Size of set: " << mySet.size() << endl;
if (mySet.empty()) {
    cout << "The set is empty" << endl;
}

自定义排序

#include <iostream>
#include <set>
using namespace std;
// 自定义比较函数对象
struct Compare {
    bool operator()( int a,  int b)const {
        return a > b;  // 降序排序
    }
};


int main() {
    set<int, Compare> myCustomSet;
    myCustomSet.insert(10);
    myCustomSet.insert(20);
    myCustomSet.insert(5);
    for (int a :myCustomSet) {
        cout << a << " ";
    }
    return 0;
}

### C++ `set` 容器概述 `set` 是 C++ 标准库中的关联容器之一,用于存储唯一的元素并自动保持这些元素处于排序状态。该容器内部通常通过红黑树实现,这使得插入、删除和查找操作的时间复杂度均为 O(log n)[^4]。 #### 基本构造方式 可以使用默认构造函数创建一个空集合: ```cpp #include <set> using namespace std; // 创建一个空的整数集 set<int> emptySet; ``` 也可以利用已有的数据结构来初始化一个新的 `set` 对象: ```cpp vector<int> vec = {7, 3, 6, 9, 3, 1, 6, 2}; set<int> fromVector(vec.begin(), vec.end()); ``` #### 自定义排序规则 除了按自然顺序排列外,还可以通过提供第二个模板参数来自定义比较逻辑。例如,要建立一个降序排列的整数集合,则可采用如下形式: ```cpp struct Greater { bool operator()(const int& lhs, const int& rhs) const { return lhs > rhs; } }; set<int, Greater> descendingInts; ``` 或者更简洁地使用标准库提供的 `greater<T>` 类型作为第二模板参数: ```cpp set<int, greater<int>> descSet{8, 5, 3, 7}; // 初始化列表语法 ``` 上述两种方法均实现了相同的效果——即构建了一个按照数值大小逆向排序的整数集合[^1][^3]。 #### 集合的基本操作 对于已经存在的 `set` 实例来说,支持多种常见的成员函数来进行增删查改等常规处理动作。下面列举了一些常用的 API 接口及其简单应用实例: - **插入新项** 插入单个元素至集合中: ```cpp set<double> numbers; auto resultPair = numbers.insert(3.14); ``` - **移除现有条目** 移除特定值对应的节点: ```cpp if (!numbers.empty()) { size_t removedCount = numbers.erase(*numbers.begin()); } ``` - **查询是否存在某元素** 判断给定的目标是否存在于当前范围内: ```cpp double targetValue = 2.718; auto foundIt = numbers.find(targetValue); if (foundIt != numbers.end()) { cout << "Found value: " << *foundIt << endl; } else { cout << "Not Found!" << endl; } ``` - **遍历全部组件** 迭代访问每一个成员变量直至结束标志位为止: ```cpp for (const auto& elem : numbers) { printf("%.2f\n", elem); } // 或者传统风格迭代器循环 for (auto iter = numbers.cbegin(); iter != numbers.cend(); ++iter) { cout << *iter << ' '; } ``` 以上就是关于如何运用 C++ 编程语言里的 `set` 数据类型的介绍以及一些基础的操作指南。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值