C++ 笔记 21 (STL常用算法 - 遍历 查找)

news/2024/11/16 8:29:09/

五. STL-常用算法

概述:

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

1. 常用遍历算法

for_each  遍历容器
transform  搬运容器到另一个容器

1.1 for_each

功能:实现遍历容器
原型:

for_each(iterator beg, iterator end ,_func())
/*iterator beg为开始迭代器,iterator end为结束迭代器,_func()为函数或者函数对象*/

示例:

//普通函数
void print01(int val)
{cout<<val<<" ";
}//函数对象
class Print02
{public:void operator()(int val){cout<<val<<" "}
};vector<int>v;
for_each(v.begin(),v.end(),print01);
for_each(v.begin(),v.end(),print02());

总结:for_each是最常用的遍历算法,需要熟练掌握。

1.2 transform

搬运容器到另一个容器中;
原型:

transform(iterator beg1,iterator end1,iterator beg2,_func)

示例:

class TransForm
{public:int  operator()(int val){return val + 100;}
};
... ...
vTarget.resize(v.size()); //目标容器需要提前开辟空间
transform(v.begin(),v.end(),vTarget.begin(),TransForm());

总结:搬运的目标容器必须提前开辟空间,否则无法正常搬运。

2. 常用查找算法

find //查找元素
find_if  //按条件查找元素
adjacent_find  //查找相邻重复元素
binary_search  //二分查找法
count    //统计元素个数
conut_if  //按条件统计元素个数  

2.1 find

功能:查找指定元素,找到返回指定元素的迭代器,找不到返回结束迭代器end()。
原型:

find(iterator beg , iterator end ,value) 
//value为查找的元素

示例:

//查找容器中是否有5这个元素
vector<int>::iterator it = find(v.begin(),v.end(),5);
if(it == v.end())
{cout<<"没有找到"<<endl;
}
else
{cout<<"找到:"<<*it<<endl;
}//查找容器中是否有P2这个对象
class Person
{public:Person (string name ,int age){this->m_name = name;this->mAge = age;}
//重载 ==bool operator == (const Person & p){if(this->m_Name == p.m_Name && this->m_Age == p.m_Age){return true;}return false;}public:string m_Name;int m_Age;
};vector<Person>v;
Person p1("aaa",10);
Person p2("bbb",20);
Person p3("ccc",30);
v.push_back(p1);
v.push_back(p2);
v.push_back(p3);
vector<Person>::iterator it = find(v.begin(),v.end(),p2);
if(it == v.end())
{... ...
}

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

2.2 find_if

功能:按条件查找元素
原型:

find_if(iterator beg,iterator end, _pred);
//_pred为谓词

示例:

//内置数据类型
class GreaterFive
{public:bool operator()(int val){return val > 5;}
};
... ...
vector<int>::iterator it = find_if(v.begin(),v.end(),GreaterFive());
if(it == v.end())
{cout<<"没有找到"<<endl;
}
else
{cout<<"找到大于5的数字:"<<*it<<endl;
}//自定义数据类型
class Person
{... ...
};
class Greater20
{public:bool operator()(Person & p){return p.m_Age > 20;}
};
... ...
vector<Person>::iterator it = find_if(v.begin(),v.end(),Greater20());
if(it == v.end())
{... ...
}

总结:find_if按条件查找使查找更加灵活,提供的仿函数可以改变不同的策略。

2.3 adjacent_find

功能:查找相邻重复元素
原型:

adjacent_find (iterator beg ,iterator end);
//查找相邻重复元素,返回相邻元素的第一个位置的迭代器
vector<int>::iterator it = adjacent_find(v.begin(),v.end());
if(it == v.end())
{cout<<"找不到"<<endl;
}
else
{cout<<"找到相邻重复元素为:"<<*it<<endl;
}

2.4 binary_search

功能:查找指定元素是否存在
原型:

bool binary_search (iterator beg , iterator end, value);
//查找指定元素,查到返回true,否则false
//注意,在无序序列中不可用

示例:

//二分查找
bool ret = binary_search(v.begin(),v.end(),2);

总结:二分查找法效率很高,但是查找的容器中元素必须是有序序列。

2.5 count

功能:统计元素个数
原型:

count(iterator beg, iterator end, value);
//统计元素出现的个数

示例:

//内置数据类型
int num = count(v.begin(),v.end(),4);
... ...
//自定义数据类型
class Person
{public:Person (string name ,int age){this->m_name = name;this->mAge = age;}
//重载 ==bool operator == (const Person & p){if(this->m_Name == p.m_Name && this->m_Age == p.m_Age){return true;}return false;}public:string m_Name;int m_Age;
};
Person p ("aaa",10);
int num = count(v.begin(),v.end(),p);

总结:统计自定义数据类型的时候,需要配合重载operator==

2.6 count_if

功能:按条件统计元素个数
原型:

count_if(iterator beg , iterator end, _Pred);
// _Pred为谓词

示例:

class Greater4
{public:bool operator()(int val){return val >= 4;}
};int num = count_if(v.begin(),v.end(),Grearer4());
cout<<"大于4的个数为:"<<num<<endl;

http://www.ppmy.cn/news/60704.html

相关文章

LoopClosing

LoopClosing类是ORB_SLAM2算法中的闭环检测模块。闭环检测在SLAM系统中起着非常关键的作用&#xff0c;它可以检测到机器人在环境中已经访问过的地方&#xff0c;通过消除累积误差来优化地图。LoopClosing类与跟踪&#xff08;Tracking&#xff09;、局部地图构建&#xff08;L…

酷游浅谈网站Javas cript型别

最近整理了一下&#xff0c;【酷游娜娜手机&#x1d54d;找看看nay3989提供】就决定跟大家讨论一下最近对于Javascripet的型别认识。 弱型别&#xff36;&#xff33; 强型别 Javascripet是一种「弱型别」的语言&#xff0c;所以会产生很多你意想不到恶心的事情 至于什么是弱…

算法设计与分析期末复习

教材&#xff1a;计算机算法设计与分析&#xff08;第五版&#xff09; 王晓东著 一 算法复杂性分析 1 时间复杂性T(n)  最坏情况Tmax(n)  最好情况Tmin(n)  平均情况Tavg(n)∑p(I)T(I) 其中I是问题规模为n的一个实例&#xff0c;p(I)是实例I出现的概率。 2 渐进复杂性…

[计算机图形学]动画与模拟:欧拉方法、刚体与流体(前瞻预习/复习回顾)

一、前言 这是本专栏的倒数第二篇文章了&#xff0c;为什么不是最后一篇&#xff1f;因为我要单独写一篇总结哈哈&#xff0c;不管怎么说&#xff0c;从今年的3.13的MVP变换开始写&#xff0c;写到现在&#xff0c;也是一个很大的工程了&#xff0c;我很高兴能在大二下学期的期…

6.S081——陷阱部分(一文读懂Xv6系统调用)——xv6源码完全解析系列(5)

0.briefly speaking 这篇博客将要开始尝试阅读和研究与Xv6陷阱机制相关的代码&#xff0c;主要有以下文件&#xff0c;最重要的是结合Xv6 book将Xv6处理陷阱的相关逻辑和流程弄透。在Xv6的语境中所谓陷阱的触发有以下三种情况&#xff1a; 系统调用严重错误&#xff08;比如除…

多元时间序列 | BP神经网络多变量时间序列预测(Matlab完整程序)

多元时间序列 | BP神经网络多变量时间序列预测(Matlab完整程序) 目录 多元时间序列 | BP神经网络多变量时间序列预测(Matlab完整程序)预测结果评价指标基本介绍程序设计参考资料预测结果 评价指标 训练集数据的R2为:0.99805 测试集数据的R2为:0.98351 训练集数据的MAE为:…

架构设计-数据库篇

大家好&#xff0c;我是易安&#xff01; 之前我们讲过架构设计的一些原则&#xff0c;和架构设计的方法论&#xff0c;今天我们谈谈高性能数据库集群的设计与应用。 读写分离原理 读写分离的基本原理是将数据库读写操作分散到不同的节点上&#xff0c;下面是其基本架构图。 读…

【Linux多线程编程-自学记录】04.线程链接-pthread_join

Linux多线程编程学习代码&#xff08;代码已上传gitee&#xff0c;还请各位兄弟点个Star哦&#xff01;&#xff09; https://gitee.com/chenshao777/linux_thread.git 笔记&#xff1a; 线程链接 pthread_join int pthread_join(pthread_t thread, void **retval); 功能&…