STL算法实现
来源:互联网 发布:21级研究所升级数据 编辑:程序博客网 时间:2024/06/04 23:23
写了一点STL算法,模板编程确实有点复杂,编译起来一个error接一个error。有一点体会,STL中的迭代器全都是pass by value,也就是值传递,这一点在《Effective C++》也有说明:内置类型、迭代器、仿函数作为参数应该传值,其它类型尽量传址。
using namespace std;// 求给定区域内的和template <class InputIterator, class T>T accumulate(InputIterator begin, InputIterator end, T init){while (begin != end){init += *begin;begin++;}return init;}// 给定区域用BinOp仿函数计算结果template <class InputIterator, class T, class BinOp>T accumulate(InputIterator begin, InputIterator end, T init, BinOp op){while (begin != end){init = op(init, *begin);begin++;}return init;}// 容器中后一个数减前一个数template <class InputIterator, class OutputIterator>OutputIterator adjacent_difference(InputIterator begin, InputIterator end, OutputIterator output){if (begin == end)return output;// 萃取InputIterator迭代器所指元素的类型iterator_traits<InputIterator>::value_type last = *begin;*output++ = *begin++;while (begin != end){iterator_traits<InputIterator>::value_type current = *begin++;*output++ = current - last;last = current;}return output;// 返回迭代器指向输出区间之后}// 容器中后一个数和前一个数做BinOp运算template <class InputIterator, class OutputIterator, class BinOP>OutputIterator adjacent_difference(InputIterator begin, InputIterator end,OutputIterator output, BinOP op){if (begin == end)return output;// 萃取InputIterator迭代器所指元素的类型iterator_traits<InputIterator>::value_type last = *begin;*output++ = *begin++;while (begin != end){iterator_traits<InputIterator>::value_type current = *begin++;*output++ = op(current, last);last = current;}return output;// 返回迭代器指向输出区间之后}// 求两个序列的内积template <class InputIterator1, class InputIterator2, class T>T inner_product(InputIterator1 begin1, InputIterator1 end1, InputIterator2 begin2, T init){while (begin1 != end1){init += *begin1 * *begin2;++begin1;++begin2;}return init;}// 两个序列进行BinOp操作template <class InputIterator1, class InputIterator2, class T, class BinOp>T inner_product(InputIterator1 begin1, InputIterator1 end1, InputIterator2 begin2, T init){while (begin1 != end1){init += *begin1 * *begin2;++begin1;++begin2;}return init;}// 交换两个迭代器的元素template <class ForwardIterator1, class ForwardIterator2>void Iter_swap(ForwardIterator1 iter1, ForwardIterator2 iter2){iterator_traits<ForwardIterator1>::value_type value = *iter1;*iter1 = *iter2;*iter2 = value;}// 针对前向迭代器template <class ForwardIterator, class T>ForwardIterator __Lower_bound(ForwardIterator first, ForwardIterator last, const T &value, forward_iterator_tag){int len = 0;distance(first, last, len);// 计算区间长度,前向迭代器无法直接相减int half;ForwardIterator middle;while (len > 0){half = len >> 1;middle = first;advance(middle, half);// 一步步向前走if (*middle < value)// value在右边{first = middle;++first;len = len - half - 1;}else// value在左边len = half;}return first;}// 针对随机迭代器template <class RandomIterator, class T>RandomIterator __Lower_bound(RandomIterator first, RandomIterator last, const T &value, random_access_iterator_tag){int len = 0;len = last - first;// 计算区间长度,随即迭代器可直接相减int half;RandomIterator middle;while (len > 0){half = len >> 1;middle = first + half;// 迭代器直接跳到中间if (*middle < value)// value在右边{first = middle + 1;len = len - half - 1;}else// value在左边len = half;}return first;}// 应用于有序区间[first,last),返回第一个等于value的迭代器template <class ForwardIterator, class T>ForwardIterator Lower_bound(ForwardIterator first, ForwardIterator last, const T &value){// 萃取迭代器类型,前向迭代器或随机迭代器,最后一个参数是一个临时对象return __Lower_bound(first, last, value, iterator_traits<ForwardIterator>::iterator_category());}
0 0
- STL算法实现
- STL-power算法实现
- Dijkstra算法的STL实现
- STL算法实现 多项式加法
- STL常用算法的实现----小话STL(1)
- stl中list的sort算法实现
- 全排列算法之STL实现
- STL(3)之for_each算法实现
- 利用STL栈实现括号匹配算法
- 关于桶排序算法的STL实现
- STL 优先队列实现的DIJSKTRA算法
- 用STL容器实现Dijkstraalg算法
- stl中list的sort算法实现
- STL 简单 <stl_numeric.h> 算法的实现
- STL 简单 <stl_algorithms.h> 算法的实现
- STL 简单 copy 算法的实现
- STL sort算法技巧和基本排序算法实现
- STL算法
- 为什么要在引入的css或者js文件后面加参数的详细讲解
- shuipfcms 多级嵌套查询栏目名称ID
- 吐司的移动,多次点击事件,holder优化ListView,更新ListView
- forward 和redirect的区别
- 小技巧:让linux程序在后台运行
- STL算法实现
- iOS中的socket通信
- NWERC 2013 update~
- sed
- C6000中C语言的编程及优化
- <iOS>响应事件传递, nextResponder研究
- CSU-1407: 最短距离
- linux文件结构
- main()主函数内外的变量有何区别??(菜鸟级的问题)