C++ STL常用算法总结
算法:问题的求解步骤,以有限的步骤,解决数学或逻辑中的问题。
- STL中的算法主要分为两大类:与数据结构相关算法(容器中的成员函数)和通用算法(与数据结构不相干)。STL中通用算法总共有70多个,主要包含:排序,查找,排列组合,数据移动,拷贝,删除,比较组合,运算等。
- 今天我介绍我经常会用到的算法。
- accumulate 元素统计
template <class InputIterator, class T> T accumulate ( InputIterator first, InputIterator last, T init );
template <class InputIterator, class T, class BinaryOperation> T accumulate ( InputIterator first, InputIterator last, T init, BinaryOperation binary_op );
template <class InputIterator, class T>T accumulate ( InputIterator first, InputIterator last, T init )
{while ( first!=last )init = init + *first++; // or: init=binary_op(init,*first++) for the binary_op versionreturn init;
}
- 函数的声明和原理在上面。前面两个参数需要传递两个迭代器,这种迭代器是是左闭右开的,第三个参数可以传递初始值,第四个参数可以传递一个函数指针或者类名(需要重载())
- 头文件在 #include < numeric >
int myfunction (int x, int y) {return x+2*y;}
struct myclass {int operator()(int x, int y) {return x+3*y;}
} myobject;int init = 100;int numbers[] = {10,20,30};cout << accumulate (numbers, numbers+3, init, myfunction ); // 220cout << accumulate (numbers, numbers+3, init, myobject ); // 280
- binary_search 二分查找
- 这个原理很熟悉了,看看函数怎么调即可
template <class ForwardIterator, class T>bool binary_search ( ForwardIterator first, ForwardIterator last, const T& value );template <class ForwardIterator, class T, class Compare>bool binary_search ( ForwardIterator first, ForwardIterator last, const T& value, Compare comp );
- copy 拷贝
template <class InputIterator, class OutputIterator>OutputIterator copy ( InputIterator first, InputIterator last, OutputIterator result );
template<class InputIterator, class OutputIterator>OutputIterator copy ( InputIterator first, InputIterator last, OutputIterator result )
{while (first!=last) *result++ = *first++;return result;
}
- 原理和 memcpy 很相似,但是这种做法有缺陷,应该注意内存重叠的错误,如图所示,这样的话前向拷贝就会出错。
- 于是有了 copy_backward()
template <class BidirectionalIterator1, class BidirectionalIterator2>BidirectionalIterator2 copy_backward ( BidirectionalIterator1 first, BidirectionalIterator1 last, BidirectionalIterator2 result );
template<class BidirectionalIterator1, class BidirectionalIterator2>BidirectionalIterator2 copy_backward ( BidirectionalIterator1 first,BidirectionalIterator1 last, BidirectionalIterator2 result )
{while (last!=first) *(--result) = *(--last);return result;
}
- 逆向拷贝,针对于内存重叠的问题,这两种拷贝方案都有各自的适用场景。不过,我感觉还不如使用 mommove ,可以保证怎么拷贝都不会出现问题。
- count :计数
template <class InputIterator, class T>typename iterator_traits<InputIterator>::difference_typecount ( ForwardIterator first, ForwardIterator last, const T& value ) ;
template <class InputIterator, class T>ptrdiff_t count ( InputIterator first, InputIterator last, const T& value )
{ptrdiff_t ret=0;while (first != last) if (*first++ == value) ++ret;return ret;
}
- 前两个参数是迭代器,左闭右开区间,在这个区间里面寻找 value 的个数。
- count_if : 条件计数
template <class InputIterator, class Predicate>typename iterator_traits<InputIterator>::difference_typecount_if ( ForwardIterator first, ForwardIterator last, Predicate pred );
template <class InputIterator, class Predicate>ptrdiff_t count_if ( InputIterator first, InputIterator last, Predicate pred )
{ptrdiff_t ret=0;while (first != last) if (pred(*first++)) ++ret;return ret;
}
- count_if 更加方便的列出条件。
- equal:判断相等
template <class InputIterator1, class InputIterator2>bool equal ( InputIterator1 first1, InputIterator1 last1, InputIterator2 first2 );template <class InputIterator1, class InputIterator2, class BinaryPredicate>bool equal ( InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, BinaryPredicate pred );
template <class InputIterator1, class InputIterator2>bool equal ( InputIterator1 first1, InputIterator1 last1, InputIterator2 first2 )
{while ( first1!=last1 ){if (!(*first1 == *first2)) // or: if (!pred(*first1,*first2)), for pred versionreturn false;++first1; ++first2;}return true;
}
- 没啥可说的,可以传递仿函数。
- fill :填充
template < class ForwardIterator, class T >void fill ( ForwardIterator first, ForwardIterator last, const T& value );
template < class ForwardIterator, class T >void fill ( ForwardIterator first, ForwardIterator last, const T& value )
{while (first != last) *first++ = value;
}
- find : 查找
template <class InputIterator, class T>InputIterator find ( InputIterator first, InputIterator last, const T& value );
template<class InputIterator, class T>InputIterator find ( InputIterator first, InputIterator last, const T& value ){for ( ;first!=last; first++) if ( *first==value ) break;return first;}
- 还有几种变体:
- find_if 循环查找符合特定条件元素
- find_end 查找某个子序列的最后一次出现点
- find_first_of 查找某个元素首次出现点
- for_each:对某一区间内所有元素实行某种操作
template <class InputIterator, class Function>Function for_each (InputIterator first, InputIterator last, Function f);
template<class InputIterator, class Function>Function for_each(InputIterator first, InputIterator last, Function f){for ( ; first!=last; ++first ) f(*first);return f;}
- 其中仿函数可以任意变换形式
- merge:合并
template <class InputIterator1, class InputIterator2, class OutputIterator>OutputIterator merge ( InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result );template <class InputIterator1, class InputIterator2, class OutputIterator, class Compare>OutputIterator merge ( InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result, Compare comp );`
template <class InputIterator1, class InputIterator2, class OutputIterator>OutputIterator merge ( InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result )
{while (true) {*result++ = (*first2<*first1)? *first2++ : *first1++;if (first1==last1) return copy(first2,last2,result);if (first2==last2) return copy(first1,last1,result);}
}
- max 和 min
- max 获取最大值
- max_element 最大值所在位置
- min 获取最小值
- min_element 最小值所在位置
- 这四个函数都特别简单。返回位置的时候返回的是迭代器
- partile_sort:局部排序
template <class RandomAccessIterator>void partial_sort ( RandomAccessIterator first, RandomAccessIterator middle, RandomAccessIterator last );template <class RandomAccessIterator, class Compare>void partial_sort ( RandomAccessIterator first, RandomAccessIterator middle, RandomAccessIterator last, Compare comp );
- 把一个区间分成两个区间,[ first , mid ] 和 [ mid, last ] 。其中给 【first,mid】进行排序,而不给【mid,last】排序。其中,迭代器是左闭右开区间的。
- sort : 排序
template <class RandomAccessIterator>void sort ( RandomAccessIterator first, RandomAccessIterator last );template <class RandomAccessIterator, class Compare>void sort ( RandomAccessIterator first, RandomAccessIterator last, Compare comp );
- 排序,默认是升序
今天先写到这儿,下次继续
C++ STL常用算法总结相关推荐
- C++超详细STL常用算法总结
STL 常用算法: 写在开篇:整理了一些stl中很常用的算法,涉及到比较,交换,查找,遍历,复制,修改等.值得大嘎收藏呀!! 目录: STL 常用算法: 1. 常用遍历算法: 1.1 for_each ...
- 黑马C++笔记——STL常用算法
STL常用算法 1.概述 STL算法主要是由头文件algorithm functional numeric组成 algorithm 是所有STL文件中最大的一个,涉及到比较.交换.查找.遍历.复制.修 ...
- 熬夜爆肝!C++核心STL常用算法汇总整理【2W字干货预警 建议收藏】
前言 1 STL- 常用算法 1.1 常用遍历算法 1.1.1 for_each 1.1.2 transform 1.2 常用查找算法 1.2.1 find 1.2.2 find_if 1.2.3 a ...
- [C++ STL] 常用算法总结
1 概述 STL算法部分主要由头文件<algorithm>,<numeric>,<functional>组成.要使用 STL中的算法函数必须包含头文件<alg ...
- 8-7复习 stl常用算法
/* priority_queue 会自动排序 */ /*srand函数在stdlib.h头文件中,time函数在time.h头文件中.srand一般与rand函数配合生成随机数据. 一般srand和 ...
- C++ : STL常用算法: inner_product , sort ,itoa
目录 1.std::count 2.std::inner_product 3.atoi 4.itoa 5 is_sorted 6 sort 7. fill 8 mismatch 1.std::cou ...
- 【C++提高编程笔记】三.(一).STL常用容器之string容器
文章目录 1.string基本概念 2.string构造函数 3.string赋值操作 4.string字符串拼接 5.string查找和替换 6.string字符串比较 7.string字符存取 8 ...
- C++ STL 常用查找算法
C++ STL 常用查找算法 adjacent_find() 在iterator对标识元素范围内,查找一对相邻重复元素,找到则返回指向这对元素的第一个元素的迭代器.否则返回past-the-end. ...
- C++ STL 常用遍历算法
C++ STL 常用遍历算法 STL的容器算法迭代器的设计理念 1) STL的容器通过类模板技术,实现数据类型和容器模型的分离 2) STL的迭代器技术实现了遍历容器的统一方法:也为STL的算法提供 ...
- C++STL常用集合算法
C++STL常用集合算法 学习目标 算法简介 set_intersection 功能描述 函数原型 示例 总结 set_union 功能描述 函数原型 示例 总结 set_difference 功能描 ...
最新文章
- CI 如何获取get请求过来的数据
- apache camel 相关配置_MyBatis-Plus返回map自动转驼峰配置object-wrapper-factory
- 【Eclipse】将控制台输出直接保存到文本文件
- 【原创】Linux安装Redis
- FPGA异步复位设计代码
- Go语言的异常处理之errors,panic, recover
- Android快速开发(2)
- 【贪心】牛客网:把数组排成最小的数
- Golang、python中的一个异或加密算法,用来加密字符串。
- OKR怎么写?100个OKR案例模板
- Atheros AR9285 坑爹网卡只有 54M/65M,开启 150M 速率的方法
- 第17课:郭盛华课程_VB编程之菜单界面的设计
- 那些我在Android开发中所喜爱的Kotlin特性
- 【墨墨英语单词库免费开源无偿分享】小学、初中、高中、大学四六级专四专八、考研、托福、雅思等词书文本大合集
- 小镇青年程序员的逆袭人生:从差点回老家到荔枝技术骨干
- 华为鸿蒙内涵,“鸿蒙”两个字有何真意,还得让古人来解读
- HDU6638 Snowy Smile
- 记一次失败的小米前端面试经历
- 使用Google Colab对PUBG的玩家死亡数据集进行可视化分析
- 交互设计笔记(4)——理解用户:定性研究
热门文章
- 如何用常量代替session_如何用Python代替Visual Basic应用程序并节省了很多时间
- python开发是不是苦累_程序员又苦又累,程序员教师可能成为未来最理想职业!...
- 酷比魔方iwork8刷机shell_酷比魔方IWORK8旗舰版(I1-T)双系统刷机教程.doc
- videojs学习随笔记录
- 论文笔记_S2D.59_2015-ICRA_V-LOAM_低漂移、鲁棒和快速的视觉-激光 里程计和建图
- CNN卷积神经网络之卷积运算的初步理解
- 机器学习and深度学习学习资料
- 论文简述 | Line Flow Based SLAM
- 【测试篇】为什么需要测试
- 【Python】SciKit-Learn包安装问题