算法:问题的求解步骤,以有限的步骤,解决数学或逻辑中的问题。
  • STL中的算法主要分为两大类:与数据结构相关算法(容器中的成员函数)和通用算法(与数据结构不相干)。STL中通用算法总共有70多个,主要包含:排序,查找,排列组合,数据移动,拷贝,删除,比较组合,运算等。
  • 今天我介绍我经常会用到的算法。

  1. 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
  1. 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 );
  1. 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 ,可以保证怎么拷贝都不会出现问题。
  1. 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 更加方便的列出条件。
  1. 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;
}
  • 没啥可说的,可以传递仿函数。
  1. 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;
}
  1. 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 查找某个元素首次出现点
  1. 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;}
  • 其中仿函数可以任意变换形式
  1. 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);}
}
  1. max 和 min
  • max 获取最大值
  • max_element 最大值所在位置
  • min 获取最小值
  • min_element 最小值所在位置
  • 这四个函数都特别简单。返回位置的时候返回的是迭代器
  1. 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】排序。其中,迭代器是左闭右开区间的。
  1. 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常用算法总结相关推荐

  1. C++超详细STL常用算法总结

    STL 常用算法: 写在开篇:整理了一些stl中很常用的算法,涉及到比较,交换,查找,遍历,复制,修改等.值得大嘎收藏呀!! 目录: STL 常用算法: 1. 常用遍历算法: 1.1 for_each ...

  2. 黑马C++笔记——STL常用算法

    STL常用算法 1.概述 STL算法主要是由头文件algorithm functional numeric组成 algorithm 是所有STL文件中最大的一个,涉及到比较.交换.查找.遍历.复制.修 ...

  3. 熬夜爆肝!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 ...

  4. [C++ STL] 常用算法总结

    1 概述 STL算法部分主要由头文件<algorithm>,<numeric>,<functional>组成.要使用 STL中的算法函数必须包含头文件<alg ...

  5. 8-7复习 stl常用算法

    /* priority_queue 会自动排序 */ /*srand函数在stdlib.h头文件中,time函数在time.h头文件中.srand一般与rand函数配合生成随机数据. 一般srand和 ...

  6. 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 ...

  7. 【C++提高编程笔记】三.(一).STL常用容器之string容器

    文章目录 1.string基本概念 2.string构造函数 3.string赋值操作 4.string字符串拼接 5.string查找和替换 6.string字符串比较 7.string字符存取 8 ...

  8. C++ STL 常用查找算法

    C++ STL 常用查找算法 adjacent_find() 在iterator对标识元素范围内,查找一对相邻重复元素,找到则返回指向这对元素的第一个元素的迭代器.否则返回past-the-end. ...

  9. C++ STL 常用遍历算法

    C++ STL 常用遍历算法 STL的容器算法迭代器的设计理念 1) STL的容器通过类模板技术,实现数据类型和容器模型的分离  2) STL的迭代器技术实现了遍历容器的统一方法:也为STL的算法提供 ...

  10. C++STL常用集合算法

    C++STL常用集合算法 学习目标 算法简介 set_intersection 功能描述 函数原型 示例 总结 set_union 功能描述 函数原型 示例 总结 set_difference 功能描 ...

最新文章

  1. CI 如何获取get请求过来的数据
  2. apache camel 相关配置_MyBatis-Plus返回map自动转驼峰配置object-wrapper-factory
  3. 【Eclipse】将控制台输出直接保存到文本文件
  4. 【原创】Linux安装Redis
  5. FPGA异步复位设计代码
  6. Go语言的异常处理之errors,panic, recover
  7. Android快速开发(2)
  8. 【贪心】牛客网:把数组排成最小的数
  9. Golang、python中的一个异或加密算法,用来加密字符串。
  10. OKR怎么写?100个OKR案例模板
  11. Atheros AR9285 坑爹网卡只有 54M/65M,开启 150M 速率的方法
  12. 第17课:郭盛华课程_VB编程之菜单界面的设计
  13. 那些我在Android开发中所喜爱的Kotlin特性
  14. 【墨墨英语单词库免费开源无偿分享】小学、初中、高中、大学四六级专四专八、考研、托福、雅思等词书文本大合集
  15. 小镇青年程序员的逆袭人生:从差点回老家到荔枝技术骨干
  16. 华为鸿蒙内涵,“鸿蒙”两个字有何真意,还得让古人来解读
  17. HDU6638 Snowy Smile
  18. 记一次失败的小米前端面试经历
  19. 使用Google Colab对PUBG的玩家死亡数据集进行可视化分析
  20. 交互设计笔记(4)——理解用户:定性研究

热门文章

  1. 如何用常量代替session_如何用Python代替Visual Basic应用程序并节省了很多时间
  2. python开发是不是苦累_程序员又苦又累,程序员教师可能成为未来最理想职业!...
  3. 酷比魔方iwork8刷机shell_酷比魔方IWORK8旗舰版(I1-T)双系统刷机教程.doc
  4. videojs学习随笔记录
  5. 论文笔记_S2D.59_2015-ICRA_V-LOAM_低漂移、鲁棒和快速的视觉-激光 里程计和建图
  6. CNN卷积神经网络之卷积运算的初步理解
  7. 机器学习and深度学习学习资料
  8. 论文简述 | Line Flow Based SLAM
  9. 【测试篇】为什么需要测试
  10. 【Python】SciKit-Learn包安装问题