数据结构与算法(基于<algorithm>)
algorithm算法库
- 一.排序算法(sort、stable_sort、partial_sort、nth_element)
- 1.代码示例
- 2.运行结果
- 二.查找算法(find、find_if、count、binary_search)
- 1.代码示例
- 2.运行结果
- 三.变动算法(reverse、rotate、copy、remove)
- 1.代码示例
- 2.运行结果
- 四.数值算法(accumulate、inner_product、adjacent_difference、iota)需包含numeric库
- 1.代码示例
- 2.运行结果
- 五.其他算法(for_each、unique、max/min、next_permutation/prev_permutation)
- 1.代码示例
- 2.运行结果
C++的algorithm库是STL标准库的一部分,提供了许多常用的算法函数,包括排序、查找、遍历等等。这些函数可以大大简化C++操作数据结构的程序的编写过程,同时也具有高效和可靠的特性。
以下是algorithm库中一些常用的函数:
一.排序算法(sort、stable_sort、partial_sort、nth_element)
- sort:对一个区间进行排序
- stable_sort:对一个区间进行稳定排序
- partial_sort:对一个区间的前n个元素进行排序
- nth_element:对一个区间进行部分排序,保证第n个元素在排序后的正确位置上
1.代码示例
#include <iostream>
#include <vector>
#include <algorithm>using namespace std;bool cmp(string s1, string s2) {return s1.length() < s2.length();
}int main() {// sort函数排序vector<int> nums1 = { 4, 2, 8, 1, 6, 5, 7, 3 };sort(nums1.begin(), nums1.end());cout << "sort函数排序结果:";for (auto num : nums1) {cout << num << " ";}cout << endl;// stable_sort函数稳定排序vector<string> strs = { "bbb", "aa", "cccc", "dd" };stable_sort(strs.begin(), strs.end(), cmp);cout << "stable_sort函数排序结果:";for (auto str : strs) {cout << str << " ";}cout << endl;// partial_sort函数部分排序vector<int> nums2 = { 4, 2, 8, 1, 6, 5, 7, 3 };partial_sort(nums2.begin(), nums2.begin() + 3, nums2.end());cout << "partial_sort函数排序结果:";for (auto num : nums2) {cout << num << " ";}cout << endl;// nth_element函数部分排序vector<int> nums3 = { 4, 2, 8, 1, 6, 5, 7, 3 };nth_element(nums3.begin(), nums3.begin() + 5, nums3.end());cout << "nth_element函数排序结果:";for (auto num : nums3) {cout << num << " ";}cout << endl;return 0;
}
2.运行结果
二.查找算法(find、find_if、count、binary_search)
- find:在一个区间中查找一个元素
- find_if:在一个区间中查找符合条件的第一个元素
- count:统计一个区间中某个元素的个数
- binary_search:在一个有序区间中查找一个元素
1.代码示例
#include <iostream>
#include <vector>
#include <algorithm>using namespace std;int main() {vector<int> nums = {5, 2, 8, 4, 1, 9, 3, 6, 7}; // 待查找的向量int target = 4; // 目标元素// 使用find函数查找目标元素auto it = find(nums.begin(), nums.end(), target);if (it != nums.end()) {cout << "找到了目标元素,其下标为:" << it - nums.begin() << endl;} else {cout << "未找到目标元素" << endl;}// 使用find_if函数查找符合条件的第一个元素auto it2 = find_if(nums.begin(), nums.end(), [](int x){ return x % 2 == 0; });if (it2 != nums.end()) {cout << "找到了符合条件的第一个元素,其值为:" << *it2 << endl;} else {cout << "未找到符合条件的元素" << endl;}// 使用count函数统计某个元素出现的次数int countt = count(nums.begin(), nums.end(), target);cout << "目标元素出现的次数为:" << countt << endl;// 使用binary_search函数在有序区间中查找目标元素sort(nums.begin(), nums.end()); // 先对向量进行排序bool found = binary_search(nums.begin(), nums.end(), target);if (found) {cout << "在有序区间中找到了目标元素" << endl;} else {cout << "在有序区间中未找到目标元素" << endl;}return 0;
}
2.运行结果
三.变动算法(reverse、rotate、copy、remove)
- reverse:反转一个区间
- rotate:旋转一个区间
- copy:将一个区间复制到另一个区间中
- remove:将一个区间中符合条件的元素移除
1.代码示例
#include <iostream>
#include <vector>
#include <algorithm>using namespace std;int main() {// reverse函数反转一个区间vector<int> nums1 = { 1, 2, 3, 4, 5 };reverse(nums1.begin(), nums1.end());cout << "reverse函数反转结果:";for (auto num : nums1) {cout << num << " ";}cout << endl;// rotate函数旋转一个区间vector<int> nums2 = { 1, 2, 3, 4, 5 };rotate(nums2.begin(), nums2.begin() + 2, nums2.end());cout << "rotate函数旋转结果:";for (auto num : nums2) {cout << num << " ";}cout << endl;// copy函数将一个区间复制到另一个区间中vector<int> nums3 = { 1, 2, 3, 4, 5 };vector<int> nums4(nums3.size());copy(nums3.begin(), nums3.end(), nums4.begin());cout << "copy函数复制结果:";for (auto num : nums4) {cout << num << " ";}cout << endl;// remove函数将一个区间中符合条件的元素移除vector<int> nums5 = { 1, 2, 3, 4, 5 };int val = 3;auto it = remove(nums5.begin(), nums5.end(), val);nums5.erase(it, nums5.end());cout << "remove函数移除结果:";for (auto num : nums5) {cout << num << " ";}cout << endl;return 0;
}
2.运行结果
四.数值算法(accumulate、inner_product、adjacent_difference、iota)需包含numeric库
- accumulate:计算一个区间内所有元素的和
- inner_product:计算两个区间内对应元素的乘积和的和
- adjacent_difference:计算一个区间内相邻元素的差
- iota:从一个值开始,生成一个连续的区间
1.代码示例
#include <iostream>
#include <vector>
#include <numeric> // 包含 accumulate、inner_product、adjacent_difference、iota 函数using namespace std;int main() {// accumulate函数计算一个区间内所有元素的和vector<int> nums1 = { 1, 2, 3, 4, 5 };int sum = accumulate(nums1.begin(), nums1.end(), 0);cout << "accumulate函数计算结果:" << sum << endl;// inner_product函数计算两个区间内对应元素的乘积和的和vector<int> nums2 = { 1, 2, 3, 4, 5 };vector<int> nums3 = { 2, 3, 4, 5, 6 };int res = inner_product(nums2.begin(), nums2.end(), nums3.begin(), 0);cout << "inner_product函数计算结果:" << res << endl;// adjacent_difference函数计算一个区间内相邻元素的差vector<int> nums4 = { 1, 2, 6, 4, 5 };vector<int> diff(nums4.size());adjacent_difference(nums4.begin(), nums4.end(), diff.begin());cout << "adjacent_difference函数计算结果:";for (auto num : diff) {cout << num << " ";}cout << endl;// iota函数从一个值开始,生成一个连续的区间vector<int> nums5(5);iota(nums5.begin(), nums5.end(), 1);cout << "iota函数生成结果:";for (auto num : nums5) {cout << num << " ";}cout << endl;return 0;
}
2.运行结果
五.其他算法(for_each、unique、max/min、next_permutation/prev_permutation)
- for_each:对一个区间内的每个元素执行一个函数
- unique:移除一个区间中相邻的重复元素
- max、min:求出一个区间内的最大、最小元素
- next_permutation、prev_permutation:求出一个区间内的下一个/上一个排列
1.代码示例
#include <iostream>
#include <vector>
#include <algorithm>using namespace std;// for_each:对一个区间内的每个元素执行一个函数
void print(int x) {cout << x << " ";
}void test_for_each() {vector<int> nums = { 1, 2, 3, 4, 5 };cout << "原始序列:";for_each(nums.begin(), nums.end(), print);cout << endl;cout << "使用for_each函数输出每个元素:";for_each(nums.begin(), nums.end(), [](int x) {cout << x << " "; });cout << endl;
}// unique:移除一个区间中相邻的重复元素
void test_unique() {vector<int> nums = { 1, 1, 2, 2, 3, 4, 4, 5 };cout << "原始序列:";for_each(nums.begin(), nums.end(), print);cout << endl;auto new_end = unique(nums.begin(), nums.end());cout << "移除重复元素后的序列:";for_each(nums.begin(), new_end, print);cout << endl;
}// max、min:求出一个区间内的最大、最小元素
void test_max_min() {vector<int> nums = { 1, 2, 3, 4, 5 };cout << "原始序列:";for_each(nums.begin(), nums.end(), print);cout << endl;cout << "最大值为:" << *max_element(nums.begin(), nums.end()) << endl;cout << "最小值为:" << *min_element(nums.begin(), nums.end()) << endl;
}// next_permutation、prev_permutation:求出一个区间内的下一个/上一个排列
void test_permutation() {vector<int> nums = { 1, 2, 3 };cout << "原始序列:";for_each(nums.begin(), nums.end(), print);cout << endl;// 求出下一个排列next_permutation(nums.begin(), nums.end());cout << "下一个排列为:";for_each(nums.begin(), nums.end(), print);cout << endl;// 求出上一个排列prev_permutation(nums.begin(), nums.end());cout << "上一个排列为:";for_each(nums.begin(), nums.end(), print);cout << endl;
}int main() {test_for_each();test_unique();test_max_min();test_permutation();return 0;
}
2.运行结果
需要注意的是,以上仅列举了部分常用的函数,algorithm库中还有许多其他函数。在实际使用时,可以根据具体的需求来选择合适的函数,并结合其他STL容器、迭代器等工具来完成具体的任务。
数据结构与算法(基于<algorithm>)相关推荐
- 数据结构和算法——基于Java——1.数组
稀疏数组 理论补充 运用场景:当一个数组中大部分元素为0,或者为统一值的数组时.可以使用稀疏数组压缩数组释放占用的内存空间. 思想:第一行存储原数组:行,列,值.后续行存储原数组数据所在行,列,值. ...
- 数据结构与算法学习笔记(python)——第一节 数组应用程序实战
前言 本人是一个长期的数据分析爱好者,最近半年的时间的在网上学习了很多关于python.数据分析.数据挖掘以及项目管理相关的课程和知识,但是在学习的过程中,过于追求课程数量的增长,长时间关注于学习了多 ...
- 数据结构与算法(Python)– 回溯法(Backtracking algorithm)
数据结构与算法(Python)– 回溯法(Backtracking algorithm) 1.回溯法 回溯算法实际上一个类似枚举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条 ...
- JavaScript数据结构与算法——列表详解(下),基于Nodejs实现一个列表应用
1.上篇回顾: 上篇我们实现了一个列表类,并添加了一些属性,实现了比较多的方法,本文章将与大家一起使用列表实现一个图书借阅查询系统.需要使用JavaScript数据结构与算法--列表详解(上)中写好的 ...
- 【数据结构与算法】计数、基数、桶 O(n) 不基于比较
冒泡.插入.选择 O(n^2) 基于比较 快排.归并 O(nlogn) 基于比较 计数.基数.桶 O(n) 不基于比较 桶排序–>分区间桶+快速排序(归并排序(稳定性))–>取出结果 计数 ...
- 【数据结构与算法】快排、归并 O(nlogn) 基于比较
冒泡.插入.选择 O(n^2) 基于比较 快排.归并 O(nlogn) 基于比较 计数.基数.桶 O(n) 不基于比较 一.分治思想 1.分治思想:分治,顾明思意,就是分而治之,将一个大问题分解成小的 ...
- 【课程记录·本】WUT数据结构与算法综合实验 | 基于C++MFC的欢乐连连看游戏的设计与实现(附下载链接)
本文基于文章" https://blog.csdn.net/cxh_1231/article/details/89577820 "二次修改发布,原文已失效,不再维护 我的微信公众号 ...
- 数据结构与算法(基于C++语法实现)
顺序列表 Hello,各位小伙伴,大家好!这是发布星空以后的第二次写博客.本次我将跟大家分享关于学习数据结构与算法的一些知识,数据结构与算法的后续,也会陆陆续续的更新,帮助大家更好的理解. 好了,今天 ...
- c语言通用数据结构和常用算法库,基于C语言的通用数据结构和算法库
本人最近在学习数据结构的课程,在过程中发现用C语言来实现各种数据结构类型的时候很难做到真正意义上的通用的数据结构,于是在网上搜罗了一些所谓的C语言通用数据结构库,在此也将这些数据结构库一一罗列,方便大 ...
- 数据结构与算法笔记 - 绪论
数据结构与算法笔记 - 绪论 1. 什么是计算 2. 评判DSA优劣的参照(直尺) 3. 度量DSA性能的尺度(刻度) 4. DSA的性能度量的方法 5. DSA性能的设计及其优化 x1. 理论模型与 ...
最新文章
- 金蝶中间件部署报栈溢出_京东618压测时自研中间件暴露出的问题,压测级别数十万/秒...
- Swift3实现的绘制股票K线库, FastImageCache提升图片的加载和渲染速度,Chameleon颜色框架
- class不生效 weblogic_weblogic下更改jsp不生效的解决办法
- 【转】Luajit-2.1.0-beta1的发布和生成arm64用bytecode的解脱
- 网易视频云分享:如何搭建视频转码集群
- 如何禁掉SAP Fiori上传文件的病毒扫描设置
- Maven 在 mac os M1芯片 上的安装
- 千分之三用计算机怎么算,浓度换算计算器(浓度单位换算器在线使用)
- element-ui之dialog组件title插槽的使用
- .NET 云原生架构师训练营(模块二 基础巩固 日志)--学习笔记
- 今天的我们班胜利了的飞鸽传书
- ios swift 实现饼状图进度条,swift环形进度条
- 深度学习基础(十一)—— 稀疏自编码器(二)
- MP3中设置播放顺序的软件《闪存式MP3伴侣》
- 正版maya安装时,更改注册登录方式方法
- mysql core dumped_关于Segmentation fault (core dumped)几个简单问题的整理
- 成员函数的重载、覆盖与隐藏(详细)【转】
- 利用电子邮件“钓鱼”的常见手段
- 不礼让行人怎么抓拍的_斑马线前不礼让行人抓拍处罚,到底怎么才算
- 关于elementui上传图片 隐藏上传按钮