C++ STL——常用算法
注:原创不易,转载请务必注明原作者和出处,感谢支持!
注:内容来自某培训课程,不一定完全正确!
一 常用查找算法
/*
find算法 查找元素
@param beg 容器开始迭代器
@param end 容器结束迭代器
@param val 查找的元素
@return 返回查找元素的位置
*/
find(iterator beg, iterator end, val);
/*
adjacent_find算法 查找相邻重复元素
@param beg 容器开始迭代器
@param end 容器结束迭代器
@param _callback回调函数或者谓词(返回bool类型的函数对象)
@return 返回相邻元素的第一个位置的迭代器
*/
adjacent_find(iterator beg, iterator end, _callback);
/*
binary_search算法 二分查找算法
注意:在无序序列中不可用
@param beg 容器开始迭代器
@param end 容器结束迭代器
@param val 查找的元素
@return 找到返回true,否则返回false
*/
bool binary_search(iterator beg, iterator end, val);
/*
find_if算法 条件查找
@param beg 容器开始迭代器
@param end 容器结束迭代器
@param _callback 回调函数或者谓词
@return 找到返回true,否则返回false
*/
find_if(iterator beg, iterator end, _callback);
/*
count算法 统计元素出现的次数
@param beg 容器开始迭代器
@param end 容器结束迭代器
@param val 待统计元素
@return int返回元素的个数
*/
count(iterator beg, iterator end, val);
/*
count_if算法 统计元素出现的次数
@param beg 容器开始迭代器
@param end 容器结束迭代器
@param _callback回调函数或者谓词
@return int返回元素的个数
*/
count_if(iterator beg, iterator end, _callback);
常用查找算法的应用案例。
// 基础数据类型的查找
void Test1()
{
vector<int> v1;
for (int i = 0; i < 10; ++i)
{
v1.push_back(i);
}
vector<int>::iterator ret = find(v1.begin(), v1.end(), 5);
if (ret != v1.end()) {
cout << "找到了!" << endl;
}
else {
cout << "没有找到!" << endl;
}
}
// 对象类型的查找,需要给对象重载==号运算符
class Person
{
public:
Person(int age, int id) : age(age), id(id) {}
// 必须给对象重载==号运算符,否则无法使用find()
bool operator==(const Person &p) { return this->id == p.id && this->age == p.age; }
public:
int age;
int id;
};
void Test2()
{
vector<Person> v;
Person p1(10, 20), p2(30, 40), p3(50, 60);
v.push_back(p1);
v.push_back(p2);
v.push_back(p3);
vector<Person>::iterator ret = find(v.begin(), v.end(), p2);
if (ret != v.end()) {
cout << "找到了p2!" << endl;
}
else {
cout << "没找到p2!" << endl;
}
}
// binary_search()二分查找
void Test3()
{
vector<int> v;
for (int i = 0; i < 10; ++i)
{
v.push_back(i);
}
bool ret = binary_search(v.begin(), v.end(), 5);
if (ret) {
cout << "找到了5!" << endl;
}
else {
cout << "没找到5!" << endl;
}
}
// find_if()
// count(),count_if()和find(),find_if()是类似的
bool MySearch(int val)
{
// 找到第一个大于5的值
return val > 5;
}
void Test4()
{
vector<int> v;
for (int i = 0; i < 10; ++i)
{
v.push_back(i);
}
// find_if会根据我们的条件(函数),返回第一个满足条件的元素的迭代器
vector<int>::iterator ret = find_if(v.begin(), v.end(), MySearch);
if (ret != v.end()) {
cout << "ret = " << *ret << endl;
}
else {
cout << "没找到!" << endl;
}
}
二 常用遍历算法
/*
for_each遍历算法 遍历容器元素
@param beg 开始迭代器
@param end 结束迭代器
@param _callback 函数回调或者函数对象
@return 函数对象
*/
for_each(iterator beg, iterator end, _callback);
/*
transform算法 将指定区间元素搬运到另一容器中
注意:transform不会给目标容器分配内存,所以需要我们提前分配好内存
@param beg1 源容器开始迭代器
@param end1 源容器结束迭代器
@param beg2 目标容器开始迭代器
@param _callback 函数回调或者函数对象
@return 返回目标容器迭代器
*/
transform(iterator beg1, iterator end1, iterator beg2, _callback);
遍历算法应用案例。
// transform
struct MyPlus
{
int operator()(int val)
{
return val;
}
};
void MyPrint(int val)
{
cout << val << " ";
}
void Test1()
{
vector<int> v1, v2;
for (int i = 0; i < 10; ++i)
{
v1.push_back(i);
}
v2.resize(50);
transform(v1.begin(), v1.end(), v2.begin(), MyPlus());
for_each(v2.begin(), v2.end(), MyPrint);
}
C++ STL——常用算法的更多相关文章
- [C++ STL] 常用算法总结
1 概述 STL算法部分主要由头文件<algorithm>,<numeric>,<functional>组成.要使用 STL中的算法函数必须包含头文件<alg ...
- 28.STL常用算法
#include <algorithm> 算法 常用版本 描述 返回Type std::find() find(_InIt _Fisrt,_InIt _Last, _Ty& _Va ...
- c++ STL常用算法使用方法
#include <string> #include <vector> #include <functional> #include <iostream> ...
- 常用的STL查找算法
常用的STL查找算法 <effective STL>中有句忠告,尽量用算法替代手写循环:查找少不了循环遍历,在这里总结下常用的STL查找算法: 查找有三种,即点线面: 点就是查找目标为单个 ...
- STL——配接器、常用算法使用
学习STL,必然会用到它里面的适配器和一些常用的算法.它们都是STL中的重要组成部分. 适配器 在STL里可以用一些容器适配得到适配器.例如其中的stack和queue就是由双端队列deque容器适配 ...
- C++ STL 常用算术和生成算法
C++ STL 常用算术和生成算法 accumulate() accumulate: 对指定范围内的元素求和,然后结果再加上一个由val指定的初始值. #include<numeric> ...
- C++ STL 常用排序算法
C++ STL 常用排序算法 merge() 以下是排序和通用算法:提供元素排序策略 merge: 合并两个有序序列,存放到另一个序列. 例如: vecIntA,vecIntB,vecIntC是用ve ...
- C++ STL 常用查找算法
C++ STL 常用查找算法 adjacent_find() 在iterator对标识元素范围内,查找一对相邻重复元素,找到则返回指向这对元素的第一个元素的迭代器.否则返回past-the-end. ...
- C++ STL 常用遍历算法
C++ STL 常用遍历算法 STL的容器算法迭代器的设计理念 1) STL的容器通过类模板技术,实现数据类型和容器模型的分离 2) STL的迭代器技术实现了遍历容器的统一方法:也为STL的算法提供了 ...
随机推荐
- 8.Mapper动态代理
在前面例子中自定义 Dao 接口实现类时发现一个问题:Dao 的实现类其实并没有干什么 实质性的工作, 它仅仅就是通过 SqlSession 的相关 API 定位到映射文件 mapper 中相应 id ...
- C和指针--动态内存分配
1.为什么需要使用动态内存分配 数组的元素存储于内存中连续的位置上,当一个数组被声明时,它所需要的内存在编译时就被分配.当你声明数组时,必须用一个编译时常量指定数组的长度.但是,数组的长度常常在运行时 ...
- DA_03_linux网络配置及其远程连接
一: 修改Linux的基本配置 直接运行:setup,根据提示修改 1.修改主机名:vi /etc/sysconfig/network NETWORKING=yes HOSTNAME=shizhan1 ...
- PAT Basic 1087 有多少不同的值 (20 分)
当自然数 n 依次取 1.2.3.…….N 时,算式 ⌊ 有多少个不同的值?(注:⌊ 为取整函数,表示不超过 x 的最大自然数,即 x 的整数部分.) 输入格式: 输入给出一个正整数 N(2). 输出 ...
- Physical Education Lessons CodeForces - 915E (动态开点线段树)
Physical Education Lessons CodeForces - 915E This year Alex has finished school, and now he is a fir ...
- Base64编码与解码的作用
1.便于网络传输. 2.不可见性. 3.适合在http,mime协议下快速传输数据. 4 区别于加密,Base64是可以解码的,编码是 公开的,Base 64编码,任何人都可以解码
- C#的队列(Queue,ConcurrentQueue)和堆栈(Stack,ConcurrentStack)
一.Queue 表示对象的先进先出(FIFO)集合,非线程安全 常用方法 Dequeue 入队 Enqueue 出队 Contains 队列中是否存在某元素 Clear 清空队列 封装: /// ...
- 错误信息:[ERR] Sorry, can't connect to node 10.211.55.8:7001
错误信息: [root@centos-linux redis-cluster]# ./redis-trib.rb create --replicas 1 10.211.55.8:7001 10.211 ...
- ZOJ - 4114 Flipping Game
ZOJ - 4114 Flipping Game 题目大意:给出两个串s,t,n个灯泡的序列,1代表开着,0代表关着,一共操作k轮,每轮改变m个灯泡的状态,问最终能把s串变成t串的方案数. 坤神题解. ...
- [NOI2017]蚯蚓排队
嘟嘟嘟 现在看来这道题还不是特别难. 别一看到字符串就想SAM 看到\(k\)很小,所以我们可以搞一个单次修改复杂度跟\(k\)有关的算法. 能想到,每一次断开或链接,最多只会影响\(k ^ 2\)个 ...