diff --git a/STL/STL-Algorithm/README.MD b/STL/STL-Algorithm/README.MD new file mode 100644 index 0000000..0024ca0 --- /dev/null +++ b/STL/STL-Algorithm/README.MD @@ -0,0 +1,146 @@ +STL 中的 `` 头文件是 C++ 标准库中最强大、最常用的部分之一,提供了大量通用算法函数,能与任意容器(`vector`, `list`, `deque`, `array`, `set` 等)协同使用。 + +下面是 `#include ` 中 **全部主要算法的用法大全**,按功能分类汇总: + +--- + +## 🧮 一、非修改序列操作 + +| 函数 | 作用 | +| ------------------------------------ | ----------------- | +| `all_of(begin, end, pred)` | 是否所有元素都满足条件 | +| `any_of(begin, end, pred)` | 是否有任意元素满足条件 | +| `none_of(begin, end, pred)` | 所有元素都不满足条件 | +| `for_each(begin, end, func)` | 对所有元素执行函数 | +| `count(begin, end, val)` | 统计某值出现次数 | +| `count_if(begin, end, pred)` | 满足条件的个数 | +| `mismatch(begin1, end1, begin2)` | 找出两个序列第一个不匹配的位置 | +| `equal(begin1, end1, begin2)` | 判断两个序列是否相等 | +| `find(begin, end, val)` | 查找某值 | +| `find_if(begin, end, pred)` | 查找满足条件的第一个元素 | +| `find_if_not(begin, end, pred)` | 查找第一个不满足条件的元素 | +| `adjacent_find(begin, end)` | 查找连续重复的元素 | +| `search(begin1, end1, begin2, end2)` | 在一个序列中查找子序列 | +| `search_n(begin, end, count, val)` | 查找连续 count 个相同元素 | +| `find_end(...)` | 查找最后一次出现的子序列 | +| `find_first_of(...)` | 查找第一个在另一个集合中出现的元素 | + +--- + +## ✂️ 二、修改序列操作 + +| 函数 | 作用 | +| --------------------------------------------- | -------------- | +| `copy(begin, end, dest_begin)` | 拷贝元素 | +| `copy_if(begin, end, dest_begin, pred)` | 拷贝满足条件的元素 | +| `copy_n(begin, n, dest)` | 拷贝 n 个元素 | +| `move(begin, end, dest)` | 移动元素 | +| `swap_ranges(begin1, end1, begin2)` | 交换两个范围的元素 | +| `fill(begin, end, val)` | 填充区间 | +| `fill_n(begin, n, val)` | 填充 n 个元素 | +| `generate(begin, end, func)` | 用函数生成数据填充 | +| `generate_n(begin, n, func)` | 生成 n 个元素填充 | +| `remove(begin, end, val)` | 移除某个值(不改变容器大小) | +| `remove_if(begin, end, pred)` | 移除满足条件的元素 | +| `replace(begin, end, old_val, new_val)` | 替换值 | +| `replace_if(begin, end, pred, new_val)` | 满足条件的元素替换为新值 | +| `reverse(begin, end)` | 反转 | +| `rotate(begin, middle, end)` | 旋转元素(左移) | +| `shuffle(begin, end, rng)` | 随机打乱(C++11) | +| `unique(begin, end)` | 删除连续重复元素 | +| `transform(begin, end, dest, func)` | 一元函数转换 | +| `transform(begin1, end1, begin2, dest, func)` | 二元函数转换 | + +--- + +## 🔍 三、排序和相关算法 + +| 函数 | 作用 | +| ------------------------ | ----------- | +| `sort(begin, end)` | 默认升序排序 | +| `sort(begin, end, comp)` | 自定义比较函数排序 | +| `stable_sort(...)` | 稳定排序 | +| `partial_sort(...)` | 部分排序 | +| `partial_sort_copy(...)` | 排序后复制一部分 | +| `nth_element(...)` | 找第 n 小的元素 | +| `is_sorted(...)` | 判断是否已排序 | +| `is_sorted_until(...)` | 返回第一个未排序的位置 | + +--- + +## 📌 四、集合操作(前提:有序) + +| 函数 | 作用 | +| ----------------------------------------- | ------------- | +| `merge(begin1, end1, begin2, end2, dest)` | 合并两个有序区间 | +| `inplace_merge(begin, mid, end)` | 原地合并 | +| `includes(...)` | 判断一个集合是否包含另一个 | +| `set_union(...)` | 并集 | +| `set_intersection(...)` | 交集 | +| `set_difference(...)` | 差集 | +| `set_symmetric_difference(...)` | 对称差集(A ⊕ B) | + +--- + +## 🧩 五、堆操作 + +| 函数 | 作用 | +| ----------------------- | --------- | +| `make_heap(begin, end)` | 建堆 | +| `push_heap(begin, end)` | 加入新元素后调整 | +| `pop_heap(begin, end)` | 弹出堆顶 | +| `sort_heap(begin, end)` | 堆排序 | +| `is_heap(begin, end)` | 判断是否为堆 | +| `is_heap_until(...)` | 返回第一个非堆位置 | + +--- + +## 🗂 六、最值和比较 + +| 函数 | 作用 | +| ------------------------------ | -------------- | +| `min(a, b)` / `max(a, b)` | 最小/最大值(支持比较函数) | +| `minmax(a, b)` | 同时取 min 和 max | +| `min_element(begin, end)` | 序列中最小值迭代器 | +| `max_element(begin, end)` | 序列中最大值迭代器 | +| `minmax_element(...)` | 一次遍历取最小和最大元素 | +| `lexicographical_compare(...)` | 字典序比较 | +| `next_permutation(...)` | 下一个排列 | +| `prev_permutation(...)` | 上一个排列 | +| `clamp(val, lo, hi)` | 限制在区间内(C++17) | + +--- + +## 🧠 七、数值算法(需 `` 头文件) + +| 函数 | 作用 | +| ------------------------------ | ----- | +| `accumulate(begin, end, init)` | 求和 | +| `accumulate(..., op)` | 自定义加法 | +| `inner_product(...)` | 内积 | +| `adjacent_difference(...)` | 相邻差 | +| `partial_sum(...)` | 部分和 | + +--- + +## 示例:几个常用算法 + +```cpp +#include +#include +#include +#include // accumulate + +int main() { + std::vector v{5, 1, 3, 3, 9, 7}; + + std::sort(v.begin(), v.end()); // 排序 + std::reverse(v.begin(), v.end()); // 反转 + auto it = std::find(v.begin(), v.end(), 3); // 查找3 + int cnt = std::count(v.begin(), v.end(), 3); // 统计3的个数 + int sum = std::accumulate(v.begin(), v.end(), 0); // 求和 + + for (int x : v) std::cout << x << ' '; + std::cout << "\n3出现在了 " << cnt << " 次,和为 " << sum << std::endl; +} +``` diff --git a/STL/STL-Deque/README.MD b/STL/STL-Deque/README.MD new file mode 100644 index 0000000..5cfed4c --- /dev/null +++ b/STL/STL-Deque/README.MD @@ -0,0 +1,129 @@ +下面是 **C++ STL 中 `std::deque`(双端队列)** 的全部常用用法,已分类整理并覆盖其几乎所有成员函数与典型应用,适合你作为一份“用法大全”参考。 + +--- + +## ✅ 一、基础定义与构造 + +```cpp +#include +std::deque d1; // 空deque +std::deque d2(5); // 包含5个默认值为0的元素 +std::deque d3(5, 10); // 包含5个值为10的元素 +std::deque d4{1, 2, 3, 4}; // 列表初始化 +std::deque d5(d4); // 拷贝构造 +std::deque d6(d4.begin(), d4.end()); // 迭代器范围构造 +``` + +--- + +## ✅ 二、插入与删除操作 + +### ➤ 插入 + +```cpp +d.push_back(10); // 末尾插入 +d.push_front(5); // 头部插入 +d.insert(d.begin() + 1, 6); // 中间插入一个元素 +d.insert(d.begin(), 3, 7); // 插入3个7 +d.insert(d.end(), d2.begin(), d2.end()); // 插入另一个deque的内容 +``` + +### ➤ 删除 + +```cpp +d.pop_back(); // 删除末尾元素 +d.pop_front(); // 删除头部元素 +d.erase(d.begin()); // 删除指定位置 +d.erase(d.begin(), d.begin() + 2); // 删除区间 +d.clear(); // 清空所有元素 +``` + +--- + +## ✅ 三、访问元素 + +```cpp +d[i]; // 下标访问,不检查越界 +d.at(i); // 有越界检查 +d.front(); // 第一个元素 +d.back(); // 最后一个元素 +``` + +--- + +## ✅ 四、迭代器 + +```cpp +d.begin(), d.end(); // 正向迭代器 +d.rbegin(), d.rend(); // 反向迭代器 +cbegin(), cend(); // 常量迭代器 +``` + +--- + +## ✅ 五、容量与状态 + +```cpp +d.empty(); // 是否为空 +d.size(); // 当前元素个数 +d.max_size(); // 最大可容纳元素数 +d.resize(10); // 调整大小,多出部分默认值填充 +d.resize(10, -1); // 调整大小,多出部分填充为-1 +d.shrink_to_fit(); // 通常无效果(在deque上) +``` + +--- + +## ✅ 六、赋值与交换 + +```cpp +std::deque d2 = d1; // 赋值 +d2.assign(5, 100); // 用5个100覆盖 +d2.assign(d1.begin(), d1.end()); // 用另一个区间赋值 +d.swap(d2); // 交换两个deque内容 +``` + +--- + +## ✅ 七、其他实用函数 + +```cpp +std::reverse(d.begin(), d.end()); // 反转 +std::sort(d.begin(), d.end()); // 排序 +std::find(d.begin(), d.end(), 42); // 查找元素 +std::accumulate(d.begin(), d.end(), 0); // 求和(需 #include ) +``` + +--- + +## ✅ 八、典型应用示例 + +### 示例:滑动窗口最大值(单调队列) + +```cpp +std::deque window; +for (int i = 0; i < n; ++i) { + while (!window.empty() && nums[i] > nums[window.back()]) + window.pop_back(); + window.push_back(i); + if (window.front() <= i - k) + window.pop_front(); + if (i >= k - 1) + result.push_back(nums[window.front()]); +} +``` + +--- + +## ✅ 九、deque 与 vector 的区别(常问) + +| 特性 | `vector` | `deque` | +| ------- | --------- | --------------- | +| 插入/删除首端 | 效率低(O(n)) | 高效(O(1)) | +| 插入/删除尾端 | 高效(O(1)) | 高效(O(1)) | +| 内存连续性 | 连续 | 分段(非连续) | +| 用作队列 | 不推荐 | 非常推荐(特别是双端队列应用) | + +--- + +如果你需要类似 `list` 或 `vector` 的全部用法,也可以告诉我,我可以继续整理。是否需要我生成一份 PDF 或 Markdown 文档格式的备查版本? diff --git a/STL/STL-Deque/deque.cpp b/STL/STL-Deque/deque.cpp new file mode 100644 index 0000000..a37ba73 --- /dev/null +++ b/STL/STL-Deque/deque.cpp @@ -0,0 +1,22 @@ +#include +#include +#include +using namespace std; +int main(){ + deque a; + a.push_back("First"); + a.push_back("Second"); + for(string x : a){ + cout << x << " "; + } + cout << endl; + auto it = a.begin(); // auto = std::deque::iterator + a.insert(it + 1, "Insert"); + a.push_front("Naught"); + a.push_back("Last"); + for(it = a.begin(); it != a.end(); it++){ + cout << *it << " "; + } + cout << endl; + return 0; +} diff --git a/STL/STL-Deque/deque.exe b/STL/STL-Deque/deque.exe new file mode 100644 index 0000000..2a673f5 Binary files /dev/null and b/STL/STL-Deque/deque.exe differ