【STL-常用算法】

常用算法

概述:
  • 算法主要是由头文件 algorithm functional numeric 组成
  • algorithm是所有STL头文件中最大的一个,范围涉及到比较、 交换、查找、遍历操作、复制、修改等等
  • numeric体积很小,只包括几个在序列上面进行简单数学运算的模板函数
  • functional 定义了一些模板类,用以声明函数对象。

1 常用遍历算法

一 for_each //遍历容器

  • for_each(iterator beg, iterator end, _func);
    // 遍历算法 遍历容器元素
    // beg 开始迭代器
    // end 结束迭代器
    // _func 函数或者函数对象
#include<iostream>
using namespace std;
#include<algorithm>
#include<vector>//普通函数
void print01(int val)
{cout << val << " ";
}//函数对象
class print02
{
public:void operator()(int val){cout << val << " ";}
};//for_each算法基本用法
void test01()
{vector<int> v;for (int i = 0; i < 10; i++){v.push_back(i);}//遍历算法for_each(v.begin(), v.end(), print01);  //普通函数cout << endl;for_each(v.begin(), v.end(), print02()); //函数对象cout << endl;
}
int main()
{test01();return 0;
}

二 transform //搬运容器到另一个容器中

  • transform(iterator beg1, iterator end1, iterator beg2, _func);
    //beg1 源容器开始迭代器
    //end1 源容器结束迭代器
    //beg2 目标容器开始迭代器
    //_func 函数或者函数对象
#include<iostream>
using namespace std;
#include<algorithm>
#include<vector>class Transform
{
public:int operator()(int val){return val;}
};class Myprint
{
public:void operator()(int val){cout << val << " ";}
};void test01()
{vector<int> v;for (int i = 0; i < 10; i++){v.push_back(i);}vector<int>v1;v1.resize(v.size());  //提前开辟空间transform(v.begin(), v.end(), v1.begin(), Transform());for_each(v1.begin(), v1.end(), Myprint());
}
int main()
{test01();return 0;
}

2 常用查找算法

一 find
  1. find(iterator beg, iterator end, value);
    // 按值查找元素,找到返回指定位置迭代器,找不到返回结束迭代器位置
    // beg 开始迭代器
    // end 结束迭代器
    // value 查找的元素

2 .总结: 利用find可以在容器中找指定的元素,返回值是迭代器

#include<iostream>
using namespace std;
#include<algorithm>
#include<vector>class Person
{
public:Person(string name, int age){mname = name;mage = age;}//重载==bool operator==(const Person& p){if (mname == p.mname && mage == p.mage){return true;}else{return false;}}string mname;int mage;
};void test01()
{vector<int> v;for (int i = 0; i < 10; i++){v.push_back(i+1);}//查找容器中是否有5这个元素vector<int>::iterator it = find(v.begin(), v.end(),5);if (it == v.end()){cout << "没找到" << endl;}else{cout << "找到" << *it << endl;}}void test02()
{vector<Person> v;Person p1("aaa", 10);Person p2("bbb", 20);Person p3("ccc", 30);Person p4("ddd", 40);v.push_back(p1);v.push_back(p2);v.push_back(p3);v.push_back(p4);Person p10("cac", 30);vector<Person>::iterator it = find(v.begin(), v.end(), p10);if (it == v.end()){cout << "没有找到!" << endl;}else{cout << "找到姓名:" << it->mname << "年龄:" << it->mage << endl;}
}
int main()
{test01();test02();return 0;
}
find_if
  1. find_if(iterator beg, iterator end, _Pred);
    // 按值查找元素,找到返回指定位置迭代器,找不到返回结束迭代器位置
    // beg 开始迭代器
    // end 结束迭代器
    // _Pred 函数或者谓词(返回bool类型的仿函数)
#include<iostream>
#include <algorithm>
#include <vector>
#include <string>
using namespace std;
//内置数据类型
class GreaterFive
{
public:bool operator()(int val){return val > 5;}
};
void test01() {vector<int> v;for (int i = 0; i < 10; i++) {v.push_back(i + 1);}vector<int>::iterator it = find_if(v.begin(), v.end(), GreaterFive());if (it == v.end()) {cout << "没有找到!" << endl;}else {cout << "找到大于5的数字:" << *it << endl;}
}
//自定义数据类型
class Person {
public:Person(string name, int age){this->m_Name = name;this->m_Age = age;}
public:string m_Name;int m_Age;
};
class Greater20
{
public:bool operator()(Person& p){return p.m_Age > 20;}
};
void test02() {vector<Person> v;//创建数据Person p1("aaa", 10);Person p2("bbb", 20);Person p3("ccc", 30);Person p4("ddd", 40);v.push_back(p1);v.push_back(p2);v.push_back(p3);v.push_back(p4);vector<Person>::iterator it = find_if(v.begin(), v.end(), Greater20());if (it == v.end()){cout << "没有找到!" << endl;}else{cout << "找到姓名:" << it->m_Name << " 年龄: " << it->m_Age << endl;}
}
int main() {//test01();test02();system("pause");return 0;
}

adjacent_find

  1. 查找相邻重复元素
    函数原型:
    adjacent_find(iterator beg, iterator end);
    // 查找相邻重复元素,返回相邻元素的第一个位置的迭代器
    // beg 开始迭代器
    // end 结束迭代器

3 常用统计算法

count

  1. count(iterator beg, iterator end, value);
    // 统计元素出现次数
    // beg 开始迭代器
    // end 结束迭代器
    // value 统计的元素

count

  1. count_if(iterator beg, iterator end, _Pred);
    // 按条件统计元素出现次数
    // beg 开始迭代器
    // end 结束迭代器
    // _Pred 谓词

4 常用排序算法

  1. sort //对容器内元素进行排序
  2. random_shuffle //洗牌,指定范围内随机调整次序
  3. merge //合并,存储到另一容器中
  4. reverse //反转指定的元素

sort排序

  1. sort(iterator beg, iterator end, _Pred);
    // 按值查找元素,找到返回指定位置迭代器,找不到返回结束迭代器位置
    // beg 开始迭代器
    // end 结束迭代器
    // _Pred 谓词

random_shuffle排序

#include<iostream>	
using namespace std;
#include<ctime>
#include<algorithm>
#include<vector>class myprint
{
public:void operator()(int val){cout << val << " ";}
};void test01()
{srand((unsigned int)time(NULL));vector<int> v;for (int i = 0; i < 10; i++){v.push_back(i);}for_each(v.begin(), v.end(),myprint());cout << endl;//打乱random_shuffle(v.begin(), v.end());for_each(v.begin(), v.end(), myprint());cout << endl;
}int main()
{test01();return 0;
}
merge merge合并的两个容器必须的有序序列
  1. merge(iterator beg1, iterator end1, iterator beg2, iterator end2, iterator dest);
    // 容器元素合并,并存储到另一容器中
    // 注意: 两个容器必须是有序的
    // beg1 容器1开始迭代器 // end1 容器1结束迭代器 // beg2 容器2开始迭代器 // end2 容器2结束迭代器 //
    dest 目标容器开始迭代器
void test01()
{
vector<int> v1;
vector<int> v2;
for (int i = 0; i < 10 ; i++)
{
v1.push_back(i);
v2.push_back(i + 1);
}
vector<int> vtarget;
//目标容器需要提前开辟空间
vtarget.resize(v1.size() + v2.size());
//合并 需要两个有序序列
merge(v1.begin(), v1.end(), v2.begin(), v2.end(), vtarget.begin());
for_each(vtarget.begin(), vtarget.end(), myPrint());
cout << endl;
}
reverse
  1. reverse(iterator beg, iterator end);
    // 反转指定范围的元素
    // beg 开始迭代器
#include<iostream>	
using namespace std;
#include<ctime>
#include<algorithm>
#include<vector>class myprint
{
public:void operator()(int val){cout << val << " ";}
};void test01()
{vector<int> v;for (int i = 0; i < 10; i++){v.push_back(i);}for_each(v.begin(), v.end(),myprint());cout << endl;//反转reverse(v.begin(), v.end());for_each(v.begin(), v.end(), myprint());cout << endl;
}int main()
{test01();return 0;
}

5 常用拷贝和替换算法

  1. copy // 容器内指定范围的元素拷贝到另一容器中
  2. replace // 将容器内指定范围的旧元素修改为新元素
  3. replace_if // 容器内指定范围满足条件的元素替换为新元素
  4. swap // 互换两个容器的元素
copy(iterator beg, iterator end, iterator dest);
copy(v1.begin(), v1.end(), v2.begin());
replace(iterator beg, iterator end, oldvalue, newvalue);
replace(v.begin(), v.end(), 20,2000)
replace_if(iterator beg, iterator end, _pred, newvalue);
replace_if(v.begin(), v.end(), ReplaceGreater30(), 3000);
swap(container c1, container c2)
swap(v1, v2);

5 常用算术生成算法

算术生成算法属于小型算法,使用时包含的头文件为 #include numeric

  1. 计算区间内 容器元素累计总和
  2. accumulate(iterator beg, iterator end, value);
    // 计算容器元素累计总和
    // beg 开始迭代器
    // end 结束迭代器
    // value 起始值

accumulate(iterator beg, iterator end, value);

#include<iostream>
#include<vector>
#include <numeric>
#include <vector>
void test01()
{
vector<int> v;
for (int i = 0; i <= 100; i++) {
v.push_back(i);
}
int total = accumulate(v.begin(), v.end(), 0);
cout << "total = " << total << endl;
}
int main() {
test01();
system("pause");
return 0;
}

fill(iterator beg, iterator end, value);

// 向容器中填充元素
// beg 开始迭代器
// end 结束迭代器
// value 填充的值

fill(v.begin(), v.end(), 100);

6 常用集合算法

  1. set_intersection // 求两个容器的交集
  2. set_union // 求两个容器的并集
  3. set_difference // 求两个容器的差集
1 set_intersection(iterator beg1, iterator end1, iterator beg2, iterator end2, iterator dest);

// 求两个集合的交集
// 注意:两个集合必须是有序序列
// beg1 容器1开始迭代器 // end1 容器1结束迭代器 // beg2 容器2开始迭代器 // end2 容器2结束迭代器 //
dest 目标容器开始迭代器

#include <vector>
#include <algorithm>
class myPrint
{
public:
void operator()(int val)
{
cout << val << " ";
}
};
void test01()
{
vector<int> v1;
vector<int> v2;
for (int i = 0; i < 10; i++)
{
v1.push_back(i);
v2.push_back(i+5);
}
vector<int> vTarget;
//取两个里面较小的值给目标容器开辟空间
vTarget.resize(min(v1.size(), v2.size()));
//返回目标容器的最后一个元素的迭代器地址
vector<int>::iterator itEnd =
set_intersection(v1.begin(), v1.end(), v2.begin(), v2.end(), vTarget.begin());
for_each(vTarget.begin(), itEnd, myPrint());
cout << endl;
}
int main() {
test01();
system("pause");
return 0;
}

总结:
1 求交集的两个集合必须的有序序列
2 目标容器开辟空间需要从两个容器中取小值
3 set_intersection返回值既是交集中最后一个元素的位置

2 set_union(iterator beg1, iterator end1, iterator beg2, iterator end2, iterator dest);
vector<int> vTarget;
//取两个容器的和给目标容器开辟空间
vTarget.resize(v1.size() + v2.size());
//返回目标容器的最后一个元素的迭代器地址
vector<int>::iterator itEnd =
set_union(v1.begin(), v1.end(), v2.begin(), v2.end(), vTarget.begin());
for_each(vTarget.begin(), itEnd, myPrint());
cout << endl;
}
3 set_difference(iterator beg1, iterator end1, iterator beg2, iterator end2, iterator dest);
vector<int> vTarget;
//取两个里面较大的值给目标容器开辟空间
vTarget.resize( max(v1.size() , v2.size()));
//返回目标容器的最后一个元素的迭代器地址
cout << "v1与v2的差集为: " << endl;
vector<int>::iterator itEnd =
set_difference(v1.begin(), v1.end(), v2.begin(), v2.end(), vTarget.begin());
for_each(vTarget.begin(), itEnd, myPrint());
cout << endl;
cout << "v2与v1的差集为: " << endl;
itEnd = set_difference(v2.begin(), v2.end(), v1.begin(), v1.end(), vTarget.begin());
for_each(vTarget.begin(), itEnd, myPrint());
cout << endl;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/664142.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据图表方案,企业视频生产数据可视化

在信息爆炸的时代&#xff0c;如何将复杂的数据转化为直观、生动的视觉信息&#xff0c;是企业在数字化转型中面临的挑战。美摄科技凭借其独特的数据图表方案&#xff0c;为企业在数据可视化领域打开了一扇全新的大门。 一、数据图表方案的优势 1、高效便捷&#xff1a;利用数…

vscode实时预览markdown效果

安装插件 Markdown Preview Enhanced 上面是搜索框 启动预览 右键->Open Preview On the Side 效果如下&#xff1a; 目录功能 目录功能还是使用gitee吧 push后使用gitee&#xff0c;gitee上markdown支持侧边生成目录

Android矩阵Matrix裁切setRectToRect拉伸Bitmap替代Bitmap.createScaledBitmap缩放,Kotlin

Android矩阵Matrix裁切setRectToRect拉伸Bitmap替代Bitmap.createScaledBitmap缩放&#xff0c;Kotlin class MyImageView : AppCompatImageView {private var mSrcBmp: Bitmap? nullprivate var testIV: ImageView? nullconstructor(ctx: Context, attrs: AttributeSet) :…

一步到位:用Python实现PC屏幕截图并自动发送邮件,实现屏幕监控

在当前的数字化世界中&#xff0c;自动化已经成为我们日常生活和工作中的关键部分。它不仅提高了效率&#xff0c;还节省了大量的时间和精力。在这篇文章中&#xff0c;我们将探讨如何使用Python来实现一个特定的自动化任务 - PC屏幕截图自动发送到指定的邮箱。 这个任务可能看…

解决Linux Shell脚本错误:“/bin/bash^M: bad interpreter: No such file or directory”

在Linux系统中运行Shell脚本时&#xff0c;你可能会遇到一个常见的错误&#xff0c;错误信息如下&#xff1a; -bash: ./xxx.sh: /bin/bash^M: bad interpreter: No such file or directory这个错误通常是由于Shell脚本文件中存在不兼容的换行符引起的。在Windows系统中&#…

YoloV8改进策略:Block改进|DCNv4最新实践|高效涨点|完整论文翻译

摘要 涨点效果:在我自己的数据集上,mAP50 由0.986涨到了0.991,mAP50-95由0.737涨到0.753,涨点明显! DCNv4是可变形卷积的第四版,速度和v3相比有了大幅度的提升,但是环境搭建有一定的难度,对新手不太友好。如果在使用过程遇到编译的问题,请严格按照我写的环境配置。…

Linux 系统开始配置

文章目录 备份源为root 设置密码安装基本工具切换root 用户删除snap从 Ubuntu 移除 Snap 后使用 deb 文件安装软件商店和 Firefox在 Ubuntu 系统恢复到 Snap 软件包总结 删除 vim安装neovim在线安装neovim压缩安装neovim安装lazyvim安装剪切板 安装qt配置 Qt 环境不在sudoers文…

链表中的数字相加

不能简单认为将两条链表转变为整数后进行运算&#xff0c;然后将结果转变为链表。因为如果链表很长&#xff0c;这可能会导致整数溢出。 在正常的两个整数加法运算时&#xff0c;我们是从低位开始&#xff0c;然后依次相加更高位的数字&#xff0c;所以不难想到我们需要将链表反…

Git提交忽略指定文件

1.创建.gitignore文件存放到和.git同级的根目录下 #提交git时要忽略的文件或者文件夹&#xff0c;根据自己的需求来写 .idea target*.log *.iml *.jar *.war *.nar *.ear *.zip *.rar *.tar.gz2.提交.gitignore文件文件到远程仓库 分两种情况 .idea、target等无关文件已经提交到…

(每日持续更新)jdk api之NotSerializableException基础、应用、实战

博主18年的互联网软件开发经验&#xff0c;从一名程序员小白逐步成为了一名架构师&#xff0c;我想通过平台将经验分享给大家&#xff0c;因此博主每天会在各个大牛网站点赞量超高的博客等寻找该技术栈的资料结合自己的经验&#xff0c;晚上进行用心精简、整理、总结、定稿&…

【动态规划】【记忆化搜索】【回文】1312让字符串成为回文串的最少插入次数

作者推荐 【动态规划】【字符串】【表达式】2019. 解出数学表达式的学生分数 本文涉及知识点 动态规划汇总 记忆化搜索 回文 字符串 LeetCode1312. 让字符串成为回文串的最少插入次数 给你一个字符串 s &#xff0c;每一次操作你都可以在字符串的任意位置插入任意字符。 请…

基于Java SSM框架实现校园快领服务系统项目【项目源码+论文说明】

基于java的SSM框架实现校园快领服务系统演示 摘要 随着科学技术的飞速发展&#xff0c;各行各业都在努力与现代先进技术接轨&#xff0c;通过科技手段提高自身的优势&#xff1b;对于校园快领服务系统当然也不能排除在外&#xff0c;随着网络技术的不断成熟&#xff0c;带动了…

Python爬虫的基本原理

我们可以把互联网比作一张大网&#xff0c;而爬虫&#xff08;即网络爬虫&#xff09;便是在网上爬行的蜘蛛。把网的节点比作一个个网页&#xff0c;爬虫爬到这就相当于访问了该页面&#xff0c;获取了其信息。可以把节点间的连线比作网页与网页之间的链接关系&#xff0c;这样…

双非本科准备秋招(14.3)—— java线程

创建和运行线程 1、使用Thread Slf4j(topic "c.Test1")public class Test1 {public static void main(String[] args) {Thread t new Thread("t1") {Overridepublic void run() {log.debug("running");}};t.start();​log.debug("runnin…

react实现组件通信的案例

当使用React构建应用程序时&#xff0c;组件通信是一个重要的话题。以下是一个示例&#xff0c;演示了如何使用React实现组件间的通信&#xff1a; 常规方法&#xff1a; // ParentComponent.js import React, { useState } from react; import ChildComponent from ./ChildC…

Windows 共享文件 netlogon和sysvol的作用

在Windows域环境中&#xff0c;Netlogon和SYSVOL是两个非常重要的共享文件夹&#xff0c;它们由域控制器自动创建并管理&#xff0c;对于Active Directory&#xff08;AD&#xff09;域的正常运行至关重要&#xff1a; NETLOGON共享&#xff1a; 位置&#xff1a;\\<domain_…

牛客——扫雷MINE(dp,dfs,枚举+递推)

链接&#xff1a;登录—专业IT笔试面试备考平台_牛客网 来源&#xff1a;牛客网 题目描述 相信大家都玩过扫雷的游戏。那是在一个n*m的矩阵里面有一些雷&#xff0c;要你根据一些信息找出雷来。 万圣节到了 &#xff0c;“余”人国流行起了一种简单的扫雷游戏&#xff0c;…

【BIAI】Lecture 9-Motor system 1

Motor System 专业词汇 skeletal muscle 骨骼肌 smooth muscle 平滑肌 cardiac muscle 心肌 flexor reflex 屈曲反射 central pattern generators 中央模式生成器 bio-inspired bipedal robots 仿生双足机器人 myotatic stretch reflex 肌肉自伸展反射 Cortex optic nerve 视皮…

web wifi配网和模式切换-esp8266和esp32

web wifi配网和模式切换-esp8266和esp32 支持模式:1:tcp client() 2:tcp server 3:http server(POST/GET) 4:http client 5:udp,6:factory,7:mqtt 配网进入方式&#xff1a; 开机&#xff0c;指示灯亮起后(需要灯闪烁3下后)&#xff0c;需在3s内&#xff08;超过3s则会正常启动…

NUXTJS安装始终报错无法正常运行问题解决

近日在了解NuxtJS&#xff0c;按照官方给出方法进行安装后&#xff0c;不是报错&#xff0c;就是安装成功后运行不了。执行npm run dev后始终运行出错&#xff0c;判断肯定是对应版本问题&#xff0c;沿着这方向研究&#xff0c;最终运行成功了。 文档地址&#xff1a;安装 - …