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…...
汽车保养记录用什么软件记录,汽车维修记录查询系统,佳易王汽车保养维护服务记录查询管理系统操作教程
一、概述 本实例以佳易王汽车保养维护服务记录查询管理系统为例说明,其他版本可参考本实例。试用版软件资源可到文章最后了解,下载的文件为压缩包文件,请使用免费版的解压工具解压即可试用。 软件特点:1、功能实用,操…...
深入理解C/C++堆数据结构:从原理到实战
一、堆的本质与特性 1.1 什么是堆数据结构? 堆(Heap)是一种特殊的完全二叉树,它满足以下核心性质: 堆序性:每个节点的值都满足特定顺序关系 结构性:完全二叉树的结构特性(除最后一…...
WebRTC中音视频服务质量QoS之RTT衡量网络往返时延的加权平均RTT计算机制详解
WebRTC中音视频服务质量QoS之RTT衡量网络往返时延加权平均RTT计算机制的详解 WebRTC中音视频服务质量QoS之RTT衡量网络往返时延加权平均RTT计算机制的详解 WebRTC中音视频服务质量QoS之RTT衡量网络往返时延加权平均RTT计算机制的详解前言一、 RTT 网络往返时延的原理1、…...
【MATLAB实战】实现白鲸算法(BWO)优化BP神经网络:提升模型性能的新思路
一、什么是白鲸优化算法(BWO)? 白鲸优化算法是受自然界中白鲸群体行为和觅食策略启发的一种新型智能优化算法。白鲸在捕食过程中展现出高效的协作能力和适应性,例如通过“回声定位”搜索猎物位置群体间信息共享,这些行…...
多页pdf转长图
单页pdf直接打印-onenote-在该页右键,另存为图片即可。 多页pdf,期望保存为一张图片,直接可用的都需要money。可通过python库来完成: import os from pdf2image import convert_from_path from PIL import Image, ImageDrawdef …...
医疗资源联动,广州长泰医院与海南德雅医院共筑地贫防治新篇章
为贯彻落实"健康中国"战略关于出生缺陷综合防治的部署要求,推动地中海贫血防治体系建设。2025年3月15日,广州长泰医院与海南德雅医院联合主办的“地中海贫血生殖遗传干预大型义诊暨合作签约仪式”在广州正式启动,活动以“爱与希…...
2024年12月CCF-GESP编程能力等级认证C++编程三级真题解析
三级真题的难度: CCF-GESP编程能力等级认证的C++三级真题难度通常被认为是中等水平,适合具备一定编程基础的考生。以下是关于三级真题难度的一些具体信息: 1. 考试内容 C++三级考试主要涵盖以下几个方面的知识: 基本语法:包括数据类型、变量、运算符等基础知…...
DeepSeek在医学领域的应用
DeepSeek作为高性能AI大模型,在医学领域的应用场景广泛,结合其在数据处理、自然语言理解和深度学习方面的优势,显著推动了医疗行业的智能化转型。以下是其核心应用场景及具体案例: 1. 辅助诊断与决策支持 临床辅助诊断࿱…...
【机器学习】机器学习工程实战
文章目录 第1章 概述1.1 符号和定义1.1.1 数据结构1.1.2大写西格玛记法 1.2 什么是机器学习 书籍简介 【加】安德烈布可夫(Andriy Burkov ) 著 王海鹏 丁静 译 中国工信出版集团 人民邮电出版社 第1章 概述 1.1 符号和定义 1.1.1 数据结构 标量(scala…...
(五)Dart 数据类型
Dart 数据类型 常用数据类型 Numbers(数值) int:表示整数。double:表示浮点数。 Strings(字符串) String:表示字符串。 Booleans(布尔) bool:表示布尔…...
3.数据结构-串、数组和广义表
串、数组和广义表 3.1串3.1.1串的类型定义、存储结构及其运算串的顺序存储串的堆式顺序存储结构串的链式存储 3.1.2 串的模式匹配算法BF算法*KMP算法(待更新) 3.2数组3.2.1数组的顺序存储3.2.2特殊矩阵的压缩存储对称矩阵三角矩阵对角矩阵 3.3广义表*案例…...
苹果电脑杀毒软件CleanMyMac
杀毒软件在苹果家族中是一个小众软件,百度搜索苹果电脑杀毒软件,可能各种杀软良莠不齐,因为在这个市场非常小,绝大多数都是冲着“清理”去的,而不是杀毒。最近测试了一款Mac电脑杀毒软件,杀毒效果也是一般般…...
Day16:二叉搜索树和双向链表
将一个 二叉搜索树 就地转化为一个 已排序的双向循环链表 。 对于双向循环列表,你可以将左右孩子指针作为双向循环链表的前驱和后继指针,第一个节点的前驱是最后一个节点,最后一个节点的后继是第一个节点。 特别地,我们希望可以…...
Qt QML实现弹球消砖块小游戏
前言 弹球消砖块游戏想必大家都玩过,很简单的小游戏,通过移动挡板反弹下落的小球,然后撞击砖块将其消除。本文使用QML来简单实现这个小游戏。 效果图: 正文 代码目录结构如下: 首先是小球部分,逻辑比较麻…...
如何在实际应用中测量和调整直线导轨的预紧力?
在实际应用中,准确测量和调整直线导轨的预紧力对于保证设备的性能和精度至关重要,但测量和调整直线导轨的预紧力需要根据具体的导轨型号和结构来选择合适的方法。以下是一些常见的测量和调整方法: 1、使用压力传感器:在一些先进的…...
lws-minimal-ws-server前端分析
index.html index.html是前端入口 <html><head><meta charsetutf-8 http-equiv"Content-Language" content"en"/><!-- 引入js --><script src"/example.js"></script></head><body><img s…...
YOLO11 使用入门
YOLO12 使用入门 1. 源码下载2. 权重下载3. 环境配置4. 例程测试4.1. 目标检测4.1.1. 源文件 model4.1.2. 结果Results4.1.3. 边界框 Boxes 2.2. 图像分割4.2.1. 推理 model.predict4.2.2. 掩码 Masks 1. 源码下载 之前介绍了《目标检测 YOLOv5 使用入门》 现在是 2024.12.2…...
汽车感性负载-智能高边钳位能量计算
随着汽车电子技术的发展,新的电子电气架构下,越来越多的执行部件在车身出现,比如电磁阀、风机、水泵、油泵、雨刮继电器等常用的执行器, 它们一般都表现为感性特点。驱动这些负载的最简单和最常见的方法是将它们连接到高边侧开关(…...
springboot树形结构 支持模糊查询,返回匹配节点和父节点,其他节点不返回
package com.me.meterdemo.ds; import java.util.ArrayList; import java.util.List;public class TreeNode {private Long id;private String name;private Long parentId;private List<TreeNode> children new ArrayList<>();// 构造方法public TreeNode(Long i…...
pythonSTL---sys
sys 是 Python 标准库中的一个内置模块,它提供了许多与 Python 解释器和系统环境进行交互的功能。 sys方法 1. 导入 sys 模块 在使用 sys 库的功能之前,需要先导入它: import sys2. 命令行参数 (sys.argv) sys.argv 是一个包含命令行参数…...
基于Python+Flask+MySQL+HTML的爬取豆瓣电影top-250数据并进行可视化的数据可视化平台
FlaskMySQLHTML 项目采用前后端分离技术,包含完整的前端,以flask作为后端 Pyecharts、jieba进行前端图表展示 通过MySQL收集格列数据 通过Pyecharts制作数据图表 这是博主b站发布的详细讲解,感兴趣的可以去观看:【Python爬虫可…...
Python在数据处理中的应用:从入门到精通
活动发起人小虚竹 想对你说: 这是一个以写作博客为目的的创作活动,旨在鼓励大学生博主们挖掘自己的创作潜能,展现自己的写作才华。如果你是一位热爱写作的、想要展现自己创作才华的小伙伴,那么,快来参加吧!…...
七大常用智能家居协议对比
如果您不知道在项目中使用哪种智能家居通信协议,那么进入智能家居行业可能会很困难。如果没有合适的协议将其集成到智能家居生态系统中,智能家居设备将无法正常工作。否则,您将面临硬件和软件无法满足最终用户期望的风险。协议选择不当可能会…...
996引擎-问题处理:缺失特效分割文件 ModelAtlasSplitConfigs
通常我们买的资源都是带会 ModelAtlasSplitConfigs.txt 或 sceneAtlasSplitConfigs.txt 的 但有时确实找不到的话,是可以用996工具生成的:...
异步加载错误如何解决
首先是 提供两张图 如果数据过多的情况下我在所内和住家形式频繁的来回切换 导致数据展示的不一样 大家是不是有这样的问题 这个是导致了数据展示有问题的情况 住家的情况本来是没有几层的 下面我帮大家解决一下 // 防止异步延迟 const Noop () > { } const lhl (resDa…...
R语言零基础系列教程-01-R语言初识与学习路线
代码、讲义、软件回复【R语言01】获取。 R语言初识 R是一个开放的统计编程环境,是一门用于统计计算和作图的语言。“一切皆是对象”,数据、函数、运算符、环境等等都是对象。易学,代码像伪代码一样简洁,可读性高强大的统计和可视…...
C 语言实现彩票模拟:指针与数组的巧妙运用
在 C 语言编程学习中,通过实践项目来掌握知识是非常有效的途径。本次我们聚焦于一个彩票模拟程序的实现,这不仅能让大家巩固 C 语言的基础概念,还能深入理解指针和数组在实际场景中的运用。 一、彩票模拟程序需求分析 彩票模拟程序主要模拟真实彩票抽奖的过程。具体来说,需…...
自动化测试-网页聊天室
项目介绍: 针对基于WebSocket协议的网页端即时通讯系统,主导设计并实施全流程自动化测试方案。通过构建模块化测试框架,完成对核心业务场景(用户登录鉴权、消息同步、实时聊天等)的自动化验证,最终达成测试…...
WPF CommunityToolkit.MVVM库的简单使用
CommunityToolkit.MVVM 是 .NET 社区工具包中的一部分,它为实现 MVVM(Model-View-ViewModel)模式提供了一系列实用的特性和工具,能帮助开发者更高效地构建 WPF、UWP、MAUI 等应用程序。以下是关于它的详细使用介绍: 1…...
