set操作
C++ set 容器基于红黑树实现,其核心操作的时间复杂度如下:
查找、插入、删除操作:平均和最坏情况均为 O(log n),其中 n 是集合中的元素数量。这种对数级性能得益于红黑树的自平衡特性。
遍历操作:时间复杂度为 O(n),需要访问每个元素
需要注意的点:
-
容器类型限制:
array.begin() + 1这种写法要求容器支持随机访问迭代器,比如vector、deque或数组。如果是list、set这类不支持随机访问的容器,这种写法会编译错误
| 函数 | 功能 | 示例 |
|---|---|---|
next(it) |
获取下一个迭代器 | next(numSet.begin()) |
prev(it) |
获取上一个迭代器 | prev(numSet.end()) |
主要删除方法:
🛠️ 删除指定值的元素
set<int> myset{1,2,3,4,5}; int num = myset.erase(2); // 删除值为2的元素
返回值num表示成功删除的元素个数(0或1)6。
🎯 删除迭代器指向的元素
set<int>::iterator iter = myset.erase(myset.begin()); // 删除第一个元素
删除后,迭代器iter指向被删除元素的下一个位置6。
📋 删除迭代器范围内的元素
set<int>::iterator iter2 = myset.erase(myset.begin(), --myset.end());
删除从开始到倒数第二个元素之间的所有元素6。
🧹 清空整个集合
myset.clear(); // 删除所有元素
练习题目:220. 存在重复元素 III - 力扣(LeetCode)
class Solution { public: bool containsNearbyAlmostDuplicate(vector<int>& nums, int indexDiff, int valueDiff) { int n = nums.size(); if (indexDiff == n) indexDiff = n - 1; set<int> array; map<int, int> vis; for (int i = 0; i <= indexDiff; i++) { if (!vis[nums[i]]) { vis[nums[i]] = 1; array.insert(nums[i]); } else { vis[nums[i]]++; } } int INF = 0x7fffffff; int min_v = INF; auto pre_it = array.begin(); if (vis[*pre_it] > 1) min_v = 0; for (auto it = std::next(array.begin()); it != array.end(); it++) { // cout << *it << endl; min_v = min(min_v, abs(*pre_it - *it)); if (vis[*it] > 1) min_v = min(min_v, 0); pre_it = it; } if (min_v <= valueDiff) return true; int k = indexDiff + 1; for (int i = k; i < n; i++) { // 处理旧元素 if (vis[nums[i - k]] <= 1) { array.erase(nums[i - k]); } vis[nums[i - k]]--; // 插入新元素 if (!vis[nums[i]]) { vis[nums[i]] = 1; array.insert(nums[i]); auto it = array.find(nums[i]); auto next_it = std::next(it); if (it != array.begin()) { auto pre_it = std::prev(it); min_v = min(min_v, abs(*pre_it - *it)); } if (next_it != array.end()) { cout << *next_it << endl; min_v = min(min_v, abs(*next_it - *it)); } } else { min_v = min(min_v, 0); vis[nums[i]]++; } } return min_v <= valueDiff; } };
自己选择的路,跪着也要走完。朋友们,虽然这个世界日益浮躁起来,只要能够为了当时纯粹的梦想和感动坚持努力下去,不管其它人怎么样,我们也能够保持自己的本色走下去。

浙公网安备 33010602011771号