C++ STL算法函数 —— 应用及其操作实现
一、STL算法函数分类概述
STL算法库提供了大量实用函数,按功能可分为以下五类:
1. 不修改序列的操作
定义:这些算法不会改变容器中的元素,仅对数据进行查询或统计。
典型函数:
函数 | 功能 | 示例 |
---|---|---|
find(first, last, value) | 在区间 [first, last) 内顺序查找值为 value 的元素。 | find(a.begin(), a.end(), 5) |
count(first, last, value) | 统计区间内值为 value 的元素个数。 | count(a.begin(), a.end(), 3) |
all_of(first, last, pred) | 检查区间内所有元素是否满足谓词 pred 。 | all_of(a.begin(), a.end(), is_positive) |
accumulate(first, last, init) | 对区间内元素进行累加,初始值为 init 。 | accumulate(a.begin(), a.end(), 0) |
说明:
-
搜索操作:如
find
、search
。 -
批量操作:如
for_each
(对每个元素执行操作)。 -
折叠操作:如
accumulate
(将元素通过运算折叠为一个值)。
2. 修改序列的操作
定义:这些算法会直接修改容器中的元素或顺序。有复制操作、交换操作、生成操作、移除操作、顺序变更操作、采样操作。
典型函数:
函数 | 功能 | 示例 |
---|---|---|
copy(src_begin, src_end, dest) | 复制源区间元素到目标位置。 | copy(a.begin(), a.end(), b.begin()) |
swap(a, b) | 交换两个元素的值。 | swap(a[0], a[1]) |
remove(first, last, value) | 移除区间内所有值为 value 的元素(需配合 erase 使用)。 | a.erase(remove(a.begin(), a.end(), 5), a.end()) |
reverse(first, last) | 翻转区间内元素的顺序。 | reverse(a.begin(), a.end()) |
说明:
-
复制操作:如
copy
、copy_n
。 -
移除操作:如
remove
、remove_if
。 -
顺序变更操作:如
reverse
、rotate
。
3. 排序和相关操作
定义:涉及排序、划分、堆操作等与元素顺序相关的算法。有划分操作、排序操作、二分搜索操作(在已划分范围上)、集合操作(在已排序范围上)、归并操作(在已排序范围上)、堆操作、最大/最小操作、字典序比较操作、排列操作。
典型函数:
函数 | 功能 | 示例 |
---|---|---|
sort(first, last, cmp) | 对区间进行排序(默认升序)。 | sort(a.begin(), a.end()) |
binary_search(first, last, value) | 在已排序区间内进行二分查找。 | binary_search(a.begin(), a.end(), 10) |
nth_element(first, nth, last) | 将第 n 大的元素放到正确位置,左侧均小于它,右侧均大于它。 | nth_element(a.begin(), a.begin()+3, a.end()) |
make_heap(first, last) | 将区间转换为堆结构。 | make_heap(a.begin(), a.end()) |
说明:
-
划分操作:如
partition
(按条件划分元素)。 -
集合操作:如
set_union
(求并集,需已排序)。 -
排列操作:如
next_permutation
(生成下一个排列)。
4. 数值运算
定义:与数学计算相关的算法,需包含 <numeric>
头文件。
典型函数:
函数 | 功能 | 示例 |
---|---|---|
iota(first, last, start) | 用连续递增的值填充区间,从 start 开始。 | iota(a.begin(), a.end(), 1) |
inner_product(a_begin, a_end, b_begin, init) | 计算两个序列的内积(点积)。 | inner_product(a.begin(), a.end(), b.begin(), 0) |
partial_sum(first, last, dest) | 计算前缀和并写入目标位置。 | partial_sum(a.begin(), a.end(), b.begin()) |
说明:
-
此类算法通常用于数学计算,如求和、乘积、差值等。
5. 在未初始化内存上的操作
定义:直接在未初始化的内存区域构造对象,需包含 <memory>
头文件。
典型函数:
函数 | 功能 | 示例 |
---|---|---|
uninitialized_copy(src_begin, src_end, dest) | 将源区间复制到未初始化的内存。 | uninitialized_copy(a.begin(), a.end(), raw_mem) |
uninitialized_fill(first, last, value) | 在未初始化内存区间填充 value 。 | uninitialized_fill(a.begin(), a.end(), 0) |
说明:
-
这些函数用于低级内存管理,常见于自定义容器实现或性能优化场景。
总结
STL算法分类清晰,覆盖了从数据查询、修改到数学运算和内存管理的广泛需求。在算法竞赛中,合理使用这些函数可以大幅简化代码并提高效率。例如:
-
快速查找:使用
lower_bound
和binary_search
。 -
高效排序:结合
sort
和nth_element
。 -
灵活修改:通过
copy
和reverse
调整数据顺序。
二、算法函数
下面简要介绍一些在算法竞赛中常用的函数:
函数 | 功能 |
---|---|
unique(first, last) | 去除容器中相邻的重复元素,所以一般需要先排序,然后用 unique 去重。返回值为指向去重后最后一个不同元素的迭代器。注意原容器大小不变,末尾的重复元素可以用 erase() 删除。 |
nth_element(a.begin(), a.begin() + mid, a.end(), cmp) | 按指定范围进行分类,找出序列中第 n 大的元素,使其左边均为小于它的数,右边均为大于它的数。该函数一般用于求第 k 小的数。 |
binary_search(a.begin(), a.end(), value) | 在已经排序的序列上做二分查找,需要先用 sort() 排序。value 为需要查找的值,如果找到,返回 true ,否则返回 false 。 |
lower_bound(a.begin(), a.end(), x) | 在一个有序序列中进行二分查找,返回指向第一个大于或等于 x 的元素的位置。如果不存在这样的元素,则返回尾迭代器。 |
upper_bound(a.begin(), a.end(), x) | 在一个有序序列中进行二分查找,返回指向第一个大于 x 的元素的位置的迭代器。如果不存在这样的元素,则返回尾迭代器。 |
next_permutation(a.begin(), a.end()) | 将当前排列更改为全排列中的下一个排列。如果当前排列已经是全排列中的最后一个排列,该函数返回 false ,并将排列更改为全排列中的第一个排列。 |
prev_permutation() | 将当前排列更改为全排列中的上一个排列,用法与 next_permutation() 相同。 |
max(), min() | 查找最大、最小值。 |
swap() | 交换两个元素的值。 |
find(a.begin(), a.end(), value) | 顺序查找,value 为需要查找的值。如果找到,返回指向该元素的迭代器;否则返回尾迭代器。 |
reverse(a.begin(), a.end()) | 翻转数组、字符串。 |
sort(a.begin(), a.end(), cmp) | 排序,cmp 为自定义的比较函数。如果没有提供 cmp ,默认按升序排序。 |
详细说明:
1. unique(first, last)
功能:去除相邻的重复元素,通常需要先对容器进行排序。返回的迭代器指向去重后的最后一个元素,原容器的大小不变,末尾的重复元素可以通过 erase()
删除。
std::unique
函数的作用是去除相邻的重复元素,但它并不会改变容器的大小。它只是将不重复的元素移动到容器的前面,并返回一个指向去重后最后一个元素的迭代器。去重后的元素范围是从 begin()
到 unique()
返回的迭代器之间的部分,而剩下的部分(从返回的迭代器到 end()
)仍然包含原来的元素,这些元素是未定义的(通常是重复元素的残留)。
为什么会有重复元素?
-
std::unique
只去除相邻的重复元素:-
如果容器中有多个相同的元素,但它们不相邻,
std::unique
不会去除它们。 -
例如,
{1, 2, 2, 3, 2, 4}
,std::unique
只会将相邻的2
去除,结果是{1, 2, 3, 2, 4}
,后面的2
仍然存在。
-
-
std::unique
不会改变容器的大小:-
它只是将不重复的元素移动到容器的前面,并返回一个指向去重后最后一个元素的迭代器。
-
剩下的部分(从返回的迭代器到
end()
)仍然包含原来的元素,这些元素是未定义的(通常是重复元素的残留)。
-
为什么需要 erase
?
-
为了真正删除这些残留的重复元素,我们需要使用
erase
函数,将去重后的范围之后的元素删除。 -
如果不使用
erase
,容器的大小不会改变,末尾的残留元素仍然存在。
代码示例:
#include <iostream>
#include <vector>
#include <algorithm>int main() {std::vector<int> vec = {1, 2, 2, 3, 2, 4, 4, 5};// 先排序,确保相同的元素相邻std::sort(vec.begin(), vec.end());// 使用 unique 去除相邻的重复元素auto last = std::unique(vec.begin(), vec.end());// 使用 erase 删除末尾的残留元素vec.erase(last, vec.end());// 输出去重后的结果for (int i : vec) {std::cout << i << " ";}return 0;
}
输出:1 2 3 4 5
2. nth_element(a.begin(), a.begin() + mid, a.end(), cmp)
功能:在序列中找到第 n
大的元素,并将其放置在正确的位置,使得左边的元素都小于它,右边的元素都大于它。常用于快速找到第 k
小的元素。
在 std::nth_element
函数中,cmp
参数是一个可选的比较函数,用于定义元素的排序规则。如果不提供 cmp
参数,std::nth_element
会使用默认的比较规则,即升序排序(从小到大)。
默认行为
-
如果不提供
cmp
,std::nth_element
会使用operator<
来比较元素。 -
这意味着它会将序列划分为:左边的元素都小于第
n
个元素,右边的元素都大于或等于第n
个元素。
代码示例(默认):
#include <iostream>
#include <vector>
#include <algorithm>int main() {std::vector<int> vec = {5, 3, 1, 4, 2};int mid = 2; // 找第3小的元素// 使用默认的比较规则(升序)std::nth_element(vec.begin(), vec.begin() + mid, vec.end());std::cout << "第3小的元素是: " << vec[mid] << std::endl;// 输出整个向量for (int i : vec) {std::cout << i << " ";}return 0;
}
输出:第3小的元素是: 3
代码示例(自定义比较函数):
#include <iostream>
#include <vector>
#include <algorithm>bool cmp(int a, int b) {return a > b; // 降序排序
}int main() {std::vector<int> vec = {5, 3, 1, 4, 2};int mid = 2; // 找第3大的元素// 使用自定义的比较规则(降序)std::nth_element(vec.begin(), vec.begin() + mid, vec.end(), cmp);std::cout << "第3大的元素是: " << vec[mid] << std::endl;// 输出整个向量for (int i : vec) {std::cout << i << " ";}return 0;
}
3. binary_search(a.begin(), a.end(), value)
功能:在已排序的序列中进行二分查找,查找值为 value
。如果找到,返回 true
,否则返回 false
。
代码示例:
#include <iostream>
#include <vector>
#include <algorithm>int main() {std::vector<int> vec = {1, 2, 3, 4, 5};bool found = std::binary_search(vec.begin(), vec.end(), 3);std::cout << (found ? "找到" : "未找到") << std::endl;return 0;
}
输出:找到
4. lower_bound(a.begin(), a.end(), x)
功能:在有序序列中查找第一个大于或等于 x
的元素的位置。如果不存在这样的元素,返回尾迭代器。
代码示例:
#include <iostream>
#include <vector>
#include <algorithm>int main() {std::vector<int> vec = {1, 2, 4, 4, 5};auto it = std::lower_bound(vec.begin(), vec.end(), 3);if (it != vec.end()) {std::cout << "第一个大于或等于3的元素是: " << *it << std::endl;} else {std::cout << "未找到" << std::endl;}return 0;
}
输出:第一个大于或等于3的元素是: 4
5. upper_bound(a.begin(), a.end(), x)
功能:在有序序列中查找第一个大于 x
的元素的位置。如果不存在这样的元素,返回尾迭代器。
代码示例:
#include <iostream>
#include <vector>
#include <algorithm>int main() {std::vector<int> vec = {1, 2, 4, 4, 5};auto it = std::upper_bound(vec.begin(), vec.end(), 3);if (it != vec.end()) {std::cout << "第一个大于3的元素是: " << *it << std::endl;} else {std::cout << "未找到" << std::endl;}return 0;
}
输出:第一个大于3的元素是: 4
6. next_permutation(a.begin(), a.end())
功能:将当前排列更改为全排列中的下一个排列。如果当前排列已经是最后一个排列,则返回 false
,并将排列重置为第一个排列。
代码示例:
#include <iostream>
#include <vector>
#include <algorithm>int main() {std::vector<int> vec = {1, 2, 3};do {for (int i : vec) {std::cout << i << " ";}std::cout << std::endl;} while (std::next_permutation(vec.begin(), vec.end()));return 0;
}
输出:
1 2 3 1 3 2 2 1 3 2 3 1 3 1 2 3 2 1
7. prev_permutation()
功能:将当前排列更改为全排列中的上一个排列。用法与 next_permutation()
类似。
代码示例:
#include <iostream>
#include <vector>
#include <algorithm>int main() {std::vector<int> vec = {3, 2, 1};do {for (int i : vec) {std::cout << i << " ";}std::cout << std::endl;} while (std::prev_permutation(vec.begin(), vec.end()));return 0;
}
输出:
3 2 1 3 1 2 2 3 1 2 1 3 1 3 2 1 2 3
8. max(), min()
功能:用于查找序列中的最大值和最小值。
代码示例:
#include <iostream>
#include <algorithm>int main() {int a = 5, b = 3;std::cout << "最大值: " << std::max(a, b) << std::endl;std::cout << "最小值: " << std::min(a, b) << std::endl;return 0;
}
输出:
最大值: 5 最小值: 3
9. swap()
功能:交换两个元素的值。
代码示例:
#include <iostream>
#include <algorithm>int main() {int a = 5, b = 3;std::swap(a, b);std::cout << "a: " << a << ", b: " << b << std::endl;return 0;
}
输出:a: 3, b: 5
10. find(a.begin(), a.end(), value)
功能:在序列中顺序查找值为 value
的元素。如果找到,返回指向该元素的迭代器;否则返回尾迭代器。
代码示例:
#include <iostream>
#include <vector>
#include <algorithm>int main() {std::vector<int> vec = {1, 2, 3, 4, 5};auto it = std::find(vec.begin(), vec.end(), 3);if (it != vec.end()) {std::cout << "找到: " << *it << std::endl;} else {std::cout << "未找到" << std::endl;}return 0;
}
输出:找到: 3
11. reverse(a.begin(), a.end())
功能:翻转数组或字符串。
代码示例:
#include <iostream>
#include <vector>
#include <algorithm>int main() {std::vector<int> vec = {1, 2, 3, 4, 5};std::reverse(vec.begin(), vec.end());for (int i : vec) {std::cout << i << " ";}return 0;
}
输出:5 4 3 2 1
12. sort(a.begin(), a.end(), cmp)
功能:对序列进行排序,cmp
为自定义的比较函数。如果没有提供 cmp
,默认按升序排序。
代码示例:
#include <iostream>
#include <vector>
#include <algorithm>bool cmp(int a, int b) {return a > b; // 降序排序
}int main() {std::vector<int> vec = {5, 3, 1, 4, 2};std::sort(vec.begin(), vec.end(), cmp);for (int i : vec) {std::cout << i << " ";}return 0;
}
输出:5 4 3 2 1
三、两种相关例子说明
注意:最重要的一点是迭代器是左闭右开区间,即最左边能取到,但是最右边取不到,换成数组也是一样的。
1. 使用 vector
定义数列的代码
#include <bits/stdc++.h> // 包含标准库的所有头文件
using namespace std; // 使用标准命名空间vector<int> a {23, 5, 36, 4, 8, 7, 5, 23}; // 初始化一个 vector,包含元素 23, 5, 36, 4, 8, 7, 5, 23void out() { // 定义一个输出函数,用于打印 vector 的内容for (int i = 0; i < a.size(); i++) // 遍历 vectorcout << a[i] << " "; // 输出每个元素cout << endl; // 换行
}int main() {auto it = find(a.begin(), a.end(), 5); // 在 vector 中查找值为 5 的元素if (it != a.end()) cout << "yes" << endl; // 如果找到,输出 "yes"else cout << "no" << endl; // 如果没找到,输出 "no"nth_element(a.begin(), a.begin() + 4, a.end()); // 将第 5 小的元素放到正确位置out(); // 输出当前 vector 内容cout << "第 5 小:" << a[4] << endl; // 输出第 5 小的元素sort(a.begin(), a.end()); // 对 vector 进行升序排序out(); // 输出排序后的 vectorauto last = unique(a.begin(), a.end()); // 去除相邻重复元素,返回去重后的尾迭代器out(); // 输出去重后的 vectora.erase(last, a.end()); // 删除末尾的重复元素out(); // 输出最终去重后的 vectorit = lower_bound(a.begin(), a.end(), 11); // 查找第一个大于或等于 11 的元素if (it != a.end()) cout << *it << endl; // 如果找到,输出该元素it = upper_bound(a.begin(), a.end(), 5); // 查找第一个大于 5 的元素if (it != a.end()) cout << *it << endl; // 如果找到,输出该元素return 0; // 主函数结束
}
2. 使用数组定义数列的代码
#include <bits/stdc++.h> // 包含标准库的所有头文件
using namespace std; // 使用标准命名空间int a[] = {23, 5, 36, 4, 8, 7, 5, 23}; // 初始化一个数组,包含元素 23, 5, 36, 4, 8, 7, 5, 23
int n = 8; // 数组的长度void out() { // 定义一个输出函数,用于打印数组的内容for (int i = 0; i < n; i++) // 遍历数组cout << a[i] << " "; // 输出每个元素cout << endl; // 换行
}int main() {int k = find(a, a + n, 5) - a; // 在数组中查找值为 5 的元素,返回其索引if (k != n) cout << "yes" << endl; // 如果找到,输出 "yes"else cout << "no" << endl; // 如果没找到,输出 "no"nth_element(a, a + 4, a + n); // 将第 5 小的元素放到正确位置out(); // 输出当前数组内容cout << "第 5 小:" << a[4] << endl; // 输出第 5 小的元素sort(a, a + n); // 对数组进行升序排序out(); // 输出排序后的数组n = unique(a, a + n) - a; // 去除相邻重复元素,并更新数组长度out(); // 输出去重后的数组k = lower_bound(a, a + n, 11) - a; // 查找第一个大于或等于 11 的元素if (k != n) cout << a[k] << endl; // 如果找到,输出该元素k = upper_bound(a, a + n, 5) - a; // 查找第一个大于 5 的元素if (k != n) cout << a[k] << endl; // 如果找到,输出该元素if (binary_search(a, a + n, 23)) cout << "yes1" << endl; // 在数组中二分查找值为 23 的元素else cout << "no1" << endl; // 如果没找到,输出 "no1"reverse(a, a + n); // 反转数组out(); // 输出反转后的数组int b[] = {2, 5, 7, 4, 5}; // 初始化另一个数组do { // 使用 do-while 循环生成排列for (int i = 1; i < 4; i++) cout << b[i] << " "; // 输出数组的部分元素cout << " "; // 输出空格} while (next_permutation(b + 1, b + 4)); // 生成从第 2 个元素到第 4 个元素的全排列return 0; // 主函数结束
}
总结
-
vector
版本:使用 STL 容器vector
,支持动态大小调整,操作更灵活。 -
数组版本:使用静态数组,操作更底层,适合固定大小的场景。
-
两段代码的功能基本相同,包括查找、排序、去重、二分查找、排列生成等操作。
相关文章:
C++ STL算法函数 —— 应用及其操作实现
一、STL算法函数分类概述 STL算法库提供了大量实用函数,按功能可分为以下五类: 1. 不修改序列的操作 定义:这些算法不会改变容器中的元素,仅对数据进行查询或统计。 典型函数: 函数功能示例find(first, last, value…...
AI数字人:口播与唇形同步的福音,支持本地部署/批量生成/口齿清晰
Heygem:开源前端界面的老六玩家 好消息!Heygem 在 GitHub 上开源了!不过,嘻嘻,只是前端界面开源,感觉更像是来 GitHub 刷一波知名度。不过这依然是个值得关注的工具。让我们先来看看它的官方介绍ÿ…...
【鸿蒙】封装日志工具类 ohos.hilog打印日志
封装一个ohos.hilog打印日志 首先要了解hilog四大日志类型: info、debug、warm、error 方法中四个参数的作用 domain: number tag: string format: string ...args: any[ ] 实例: //普通的info日志,使用info方法来打印 //第一个参数 : 0x0…...
附下载 | 2024 OWASP Top 10 基础设施安全风险.pdf
《2024 OWASP Top 10 基础设施安全风险》报告,由OWASP(开放网络应用安全项目)发布,旨在提升企业和组织对基础设施安全风险、威胁与漏洞的意识,并提供高质量的信息和最佳实践建议。报告列出了2024年最重要的10大基础设施…...
Chatbox通过百炼调用DeepSeek
解决方案链接:评测|零门槛,即刻拥有DeepSeek-R1满血版 方案概览 本方案以 DeepSeek-R1 满血版为例进行演示,通过百炼模型服务进行 DeepSeek 开源模型调用,可以根据实际需求选择其他参数规模的 DeepSeek 模型。百炼平台…...
Vue前端项目部署到宝塔面板的详细过程
目录 前言 一、项目的打包与上传 1、修改前端项目 2、关于test环境的补充修改 3、打包前端项目 二、添加站点,启动项目 三、总结 前言 书接上回 SpringBoot项目部署到宝塔面板的详细过程-CSDN博客 本次以SmartAdmin的项目为例,通过宝塔面板部署…...
免费高质量贴图(Textures) 网站推荐
以下是一些提供 免费或高质量贴图(Textures) 的网站,包括 PBR 贴图、HDRI 贴图、材质等,适用于 Three.js、Blender、Unity、Unreal Engine 等软件。 🌍 1. Poly Haven(https://polyhaven.com/)⭐…...
C++进阶——map和set的使用
目录 1、序列式容器和关联式容器 2、set系列的使用 2.1 set和multiset的参考文档 2.2 set类的介绍 2.3 set的构造和迭代器 2.4 set的增删查 2.5 set的insert和迭代器遍历 2.6 set的find和erase 2.7 set的lower_bound和upper_bound 2.8 multiset和set的差异 2.9 349.…...
AI机器学习---Anaconda
Anaconda指的是一个开源的Python发行版本,其包含了Conda、Python等180多个科学包及其依赖项。因为包含了大量的科学包,Anaconda 的下载文件比较大(约 531 MB),如果只需要某些包,或者需要节省带宽或存储空间…...
如何在Futter开发中做性能优化?
目录 1. 避免不必要的Widget重建 问题:频繁调用setState()导致整个Widget树重建。 优化策略: 2. 高效处理长列表 问题:ListView一次性加载所有子项导致内存暴涨。 优化策略: 3. 图片加载优化 问题:加载高分辨率…...
leetcode 75.颜色分类(荷兰国旗问题)
题目描述 题目分析 本题是经典的「荷兰国旗问题」,由计算机科学家 Edsger W. Dijkstra 首先提出。 要想单独解决这道题本身还是很简单的,统计0、1、2的数量然后按顺序赋值,或者手写一个冒泡排序,whatever。 但是在这一题中我们主…...
JVM--垃圾回收
垃圾回收的概念 垃圾回收主要针对的是堆中的对象,堆是一个共享的区域,创建的对象和数组都放在这个位置。但是我们不能一直的创建对象,也不是所有的对象能一直存放,如果不进行垃圾回收,内存迟早会耗尽,及时…...
Spring boot3-Http Interface: 声明式编程
来吧 1.首先引入pom.xml依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-webflux</artifactId> </dependency> 2.创建WebClientController控制器 import com.atguigu.boot3_07_http.serv…...
springboot EasyExcel 实现导入导出
1. 添加依赖 确保 Maven 依赖中包含 EasyExcel 3.0.5: <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.0.5</version></dependency><!-- excel工具 --><dep…...
基于RAGFlow本地部署DeepSpeek-R1大模型与知识库:从配置到应用的全流程解析
作者:后端小肥肠 🍊 有疑问可私信或评论区联系我。 🥑 创作不易未经允许严禁转载。 姊妹篇: DeepSpeek服务器繁忙?这几种替代方案帮你流畅使用!(附本地部署教程)-CSDN博客 10分钟上手…...
spring 创建单例 Bean 源码分析
一、创建单例Bean 1、创建单例 Bean 通过方法getBean()来创建单例bean。 代码入口: org.springframework.beans.factory.support.DefaultListableBeanFactory#preInstantiateSingletons spring boot version:2.6.13 org.springframework.beans.factory…...
GetCurrentTime
在实际编程中难免要获取当前时间并且进行格式化,本文给出了多种 GetCurrentTime() 方法以供选择。 C语言下使用strftime C 语言中可以使用 <time.h> 中的函数来获取和格式化时间 #include <stdio.h> #include <time.h>char* getCurrentTime() …...
HTB 学习笔记 【中/英】《Web 应用简介》P1
📌 这篇文章讲了什么? 介绍了 Web 应用 的概念、架构,以及与传统网站的区别。重点讲解了 Web 安全风险,包括 常见攻击方法(SQL 注入、文件包含、不安全的文件上传等)。介绍了 Web 渗透测试 的重要性&#…...
ROS catkin_make编译报错问题
对问题 CMake Error at graduation_design/CMakeLists.txt:226 (add_dependencies): The dependency target "graduation_design_generate_messages_cpp" of target "listener" does not exist 检查 generate_messages() 是否被注释 对 CMake Error at …...
【结构设计】3D打印创想三维Ender 3 v2
【结构设计】3D打印创想三维Ender 3 v2 文章目录 前言一、Creality Slicer1.2.3打印参数设置二、配件更换1.捆扎绑扎线2.气动接头3D打印机配件插头3.3D打印机配件Ender3pro/V2喷头套件4.读卡器 TF卡5.micro sd卡 三、调平四、参考文章总结 前言 使用工具: 1.创想三…...
并发编程2
接并发编程1 synchronized锁的实现 通过底层指令控制实现,Java提供的一种原子性内置锁,在进入synchronized后会从主内存复制一份共享变量到自己的工作内存,在工作内存中修改完成后,退出时会把工作内存的值写入到主内存ÿ…...
Linux 中 Git 使用指南:从零开始掌握版本控制
目录 1. 什么是 Git? Git 的核心功能: 2. Git 的安装 Ubuntu/Debian 系统: 验证安装: 3.gitee库 4. Git 的首次配置 配置用户名和邮箱: 查看配置: 5. Git 的基本使用 初始化仓库 添加文件到暂存区…...
C# Exe + Web 自动化 (BitComet 绿灯 自动化配置、设置)
BitComet GreenLight,内网黄灯转绿灯 (HighID), 增加p2p连接率提速下载-CSDN博客 前两天写个这个,每次开机关机后要重来一遍很麻烦的索性写个自动化。 先还是按照上面的教程自己制作一遍,留下Luck 以及 路由器相关的 端口记录信息。 (因为自…...
2024年12月CCF-GESP编程能力等级认证C++编程四级真题解析
四级真题的难度: 一、总体难度评价 CCF-GESP编程能力等级认证C++四级真题的难度通常被认为相对较高。它不仅要求考生具备扎实的C++编程基础,还需要考生掌握一定的算法和数据结构知识,以及良好的问题解决能力。 二、具体难度分析 理论知识考察: 单选题和判断题中,会涉…...
谷歌Chrome或微软Edge浏览器修改网页任意内容
在谷歌或微软浏览器按F12,打开开发者工具,切换到console选项卡: 在下面的输入行输入下面的命令回车: document.body.contentEditable"true"效果如下:...
《DeepSeek深度使用教程:开启智能交互新体验》Deepseek深度使用教程
《DeepSeek使用教程:开启智能交互新体验》 在当今数字化时代,人工智能技术正以前所未有的速度改变着我们的生活和工作方式。DeepSeek作为一款强大的人工智能工具,凭借其卓越的自然语言处理能力和多领域应用潜力,受到了众多开发者…...
Dijkstra算法
Dijkstra算法(迪杰斯特拉算法)是一种经典的单源最短路径算法,用于在加权图中找到从一个源点到所有其他顶点的最短路径。它要求图中不能有负权边,因为负权边可能会导致算法的贪心策略失效。 Dijkstra算法的基本思想 Dijkstra算法…...
Python中的静态方法如何使用?
在Python里,类当中的方法可以分为多种不同的类型,其中staticmethod是一个十分有趣而又实用的功能。我们来好好地聊一聊什么是静态方法,它的用途是什么,以及如何在实际应用中使用它们! 首先,定义一下静态方…...
【最后203篇系列】016 Q201架构思考
前言 Q200已经达到了我既定的目标,在最近的3个月,我需要进一步完善,达到可以试产的程度。 在这个过程当中,许多知识和体会一直在变。 qtv200到目前,虽然通过习惯(每晚运行离线策略和比对)方式维持了注意力的集中&…...
小脑萎缩会致命吗?
小脑萎缩,顾名思义,是指小脑的体积减小或结构发生异常,进而影响其正常功能。小脑作为人体重要的协调和运动控制中心,负责维持身体平衡、调节肌肉张力和协调运动等关键功能。当小脑出现萎缩时,患者可能会出现步态不稳、…...
pip install和conda install的区别
这里写目录标题 一、什么是 Python 依赖(Python Dependencies)?1. 依赖的作用2. 如何管理 Python 依赖3. 依赖管理问题4. 依赖锁定总结 二、使用pip安装包venv隔离环境方法 1:使用 venv(推荐)创建虚拟环境激…...
這是我第一次寫關於aapenal服務器管理控制面板的文章
首先我們來認識一下服務器管理面板的所有功能 網站管理功能: 支持創建和管理多個網站。配置虛擬主機(Vhost)和域名綁定。自動安裝常用應用(如WordPress、Joomla等)。 文件管理功能: 文件上傳、…...
requests库的request和response对象的属性和方法
Python requests库 request 参数信息 response 参数信息...
8664蛋糕的美味值
8664蛋糕的美味值 ⭐️难度:中等 🌟考点:枚举 📖 📚 import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner sc new Scanner(System.in );int n sc.nextInt();int k s…...
【MySQL】数据库简要介绍和简单应用
目录 数据库简要介绍 SQL 的简单应用 需要注意的: 数据库简要介绍 数据库(database)是指长期存储在计算机内,有组织的、可共享的数据集合。它可视为一个电子化的文件柜,用来存储电子文件,用户可以对文件中的数据进行査询、新增、更新、删…...
yolo环境 pytorch环境配置 CUDA安装
我的成功案例:首先安装python 3.12.9的conda虚拟环境 (如果不安装3.12的会报错误ModuleNotFoundError:没有名为“numpy._core”的模块) 然后安装11.8cuda (其实我是可以最高安装12.6的cuda但我实测,太高版…...
camellia redis proxy v1.3.3对redis主从进行读写分离(非写死,自动识别故障转移)
1 概述 camellia-redis-proxy是一款高性能的redis代理(https://github.com/netease-im/camellia),使用netty4开发,主要特性如下: 支持代理到redis-standalone、redis-sentinel、redis-cluster。支持其他proxy作为后端…...
python相关语法的学习文档1
python相关语法的学习文档1 1、tqdm tqdm 是 Python 中一个非常流行的进度条库,可以实时显示循环或任务的进度。它简单易用,支持多种场景(如循环、文件处理、多线程/进程等)。以下是详细的使用讲解: 1.1 安装 pip install tqdm1.2 基本用法 from tqdm import tqdm impo…...
Web元件库 ElementUI元件库+后台模板页面(支持Axure9、10、11)
Axure是一款非常强大的原型设计工具,它允许设计师和开发者快速创建高保真原型,以展示应用或网站的设计和功能。通过引入各种元件库,如ElementUI元件库,可以极大地丰富Axure的原型设计能力,使其更加贴近实际开发中的UI组…...
Java 并发编程——BIO NIO AIO 概念
参考 Java 并发编程——BIO NIO AIO 概念 阻塞与非阻塞、同步与异步概念 系统调用、缓存、物理设备阻塞与非阻塞同步与异步 四种主要的 IO 模型 同步阻塞 IO同步非阻塞 IOIO 多路复用异步 IO select,poll,epoll 系统调用命令...
在微信小程序或前端开发中,picker 和 select 都是用户交互中用于选择的组件,但它们在功能、设计和使用场景上有一定的区别
在微信小程序或前端开发中,picker 和 select 都是用户交互中用于选择的组件,但它们在功能、设计和使用场景上有一定的区别。 1. picker 的特点 描述: picker 是微信小程序中的原生组件,通常用于选择单项或多项值,如时…...
笔记本 Win10 部署阿里通义千问 1.5-0.5B 大模型 mini 版
文章目录 1.环境准备1.1 硬件环境1.2 OS 环境1.3 Python 环境 2.环境安装2.1 CUDA 驱动下载安装2.2 torch 库下载安装2.3 transformers 库安装2.3 accelerate 库安装2.4 验证 CUDA 是否可用2.5 下载 Qwen1.5-0.5B 大模型 3.测试大模型3.1 加载大模型3.2 简单对话3.3 亲测体验感…...
SpringBoot事件驱动
1、概述 Spring事件驱动采用了观察者设计模式,主要作用就是实现对象之间的松耦合通信。它的核心思想是通过事件的发布和监听来实现不同组件之间的交互。(跟mq挺像) 基础概念: 事件(Event): 在Spring中&am…...
nginx中间件部署
普通权限账户安装NGINX中间件 1、拥有高级权限的账户安装必要的插件 sudo yum install -y gcc-c make pcre pcre-devel zlib zlib-devel openssl openssl-devel 2、普通账户进行NGINX的脚本式安装 vi nginx_intall.sh #!/bin/bash TAR_NAME"$1" TAR_NAME_DIRba…...
Qt程序基于共享内存读写CodeSys的变量
文章目录 1.背景2.结构体从CodeSys导出后导入到C2.1.将结构体从CodeSys中导出2.2.将结构体从m4文件提取翻译成c格式 3.添加RTTR注册信息4.读取PLC变量值5.更改PLC变量值 1.背景 在文章【基于RTTR在C中实现结构体数据的多层级动态读写】中,我们实现了通过字符串读写…...
vulnhub-Hackme-隧道建立、SQL注入、详细解题、思路清晰。
vulnhub-Hackme-隧道建立、SQL注入、详细解题、思路清晰。 一、信息收集 2025.3.14 PM 12:18 1、主机发现 arp-scan -l nmap -sn 192.168.66.0/24 2、端口扫描 1、nmap --min-rate 10000 -p- 192.168.66.182 -oA port 查看所有开放端口2、map -sS -sV 192.168.6…...
技术-NBIOT
是什么? 窄带物联网(Narrow Band Internet of Things, NB-IoT)成为万物互联网络的一个重要分支支持低功耗设备在广域网的蜂窝数据连接,也被叫作低功耗广域网(LPWAN)NB-IoT支持待机时间长、对网络连接要求较高设备的高效连接NB-Io…...
【论文阅读】AlexNet——深度学习奠基作之一
原文链接 Step 1 1. titleabstract 第一句:告诉我干了什么事情 我们训练了一个很大很深的卷积神经网络,用来对120w个图片作分类,这里面有1000个类 第二句:结果 在测试集上面,top-1 error37.5%,top-517.0…...
【云原生技术】编排与容器的技术演进之路
一、编排与容器的技术演进之路 1.1 DockerClient 此时 K8s 只是编排领域的一个选择,而 Docker 此时一家独大,所以 K8s 的客户端只 是作为 Docker 的客户端来调用 Docker 引擎来完成服务。 1.2 RUNC&Shim OCI催生 runcrunc,剥离 Docke…...
鸿蒙编译框架插件HvigorPlugin接口的用法介绍
鸿蒙系统中HvigorPlugin接口实现自定义编译插件,实现编译前后自定义功能。 在鸿蒙(HarmonyOS)开发中,HvigorPlugin 是用于扩展 Hvigor 构建工具功能的接口。通过实现此接口,开发者可以自定义构建任务、修改构建流程或…...