迭代器是类似指针的对象,分为5种,输入,输出,前向,双向和随机访问

输入迭代器(InputIterator)

输入迭代器并不是指某种类型,而是指一系列类型
举例
  1. template<class InputIterator, class T>
  2. InputIterator find (InputIterator first, InputIterator last, const T& val)
  3. {
  4. while (first!=last) {
  5. if (*first==val) return first;
  6. ++first;
  7. }
  8. return last;
  9. }

非可变序列算法(不改变容器内容);find, adjacent_find, count, for_each, midmatch, equal, search

find_if,查找序列中第1个使给定的判断函数(函数对象)返回真的元素

  1. template<class InputIterator, class UnaryPredicate>
  2. InputIterator find_if (InputIterator first, InputIterator last, UnaryPredicate pred)
  3. {
  4. while (first!=last) {
  5. if (pred(*first)) return first;
  6. ++first;
  7. }
  8. return last;
  9. }

adjacent_find算法在序列中查找相邻且相等的两个元素(规则由函数对象决定,默认为相等),当找到这样的两个元素时,该算法返回指向两个元素中第一个元素的迭代器

  1. template <class ForwardIterator>
  2. ForwardIterator adjacent_find (ForwardIterator first, ForwardIterator last)
  3. {
  4. if (first != last)
  5. {
  6. ForwardIterator next=first; ++next;
  7. while (next != last) {
  8. if (*first == *next) // or: if (pred(*first,*next)), for version (2)
  9. return first;
  10. ++first; ++next;
  11. }
  12. }
  13. return last;
  14. }

count是一种非可变序列算法,其功能是在序列中查找等于某个给定值的元素的个数

  1. template <class InputIterator, class UnaryPredicate>
  2. typename iterator_traits<InputIterator>::difference_type
  3. count (InputIterator first, InputIterator last, UnaryPredicate pred)
  4. {
  5. typename iterator_traits<InputIterator>::difference_type ret = 0;
  6. while (first!=last) {
  7. if (pred(*first)) ++ret;
  8. ++first;
  9. }
  10. return ret;
  11. }
  1.  
  1.  

count_if:

  1. template <class InputIterator, class UnaryPredicate>
  2. typename iterator_traits<InputIterator>::difference_type
  3. count (InputIterator first, InputIterator last, UnaryPredicate pred)
  4. {
  5. typename iterator_traits<InputIterator>::difference_type ret = 0;
  6. while (first!=last) {
  7. if (pred(*first)) ++ret;
  8. ++first;
  9. }
  10. return ret;
  11. }

例子:

  1. #include <algorithm>
  2. #include <iostream>
  3. #include <vector>
  4. #include <functional>
  5. using namespace std;
  6.  
  7. int main(void)
  8. {
  9. int arr[] = {1, 3, 2, 1, 4, 1, 7, 1, 10};
  10. vector<int> v(&arr[0], &arr[9]);
  11. int cnt1 = count(v.begin(), v.end(), 1);
  12. int cnt2 = count_if(v.begin(), v.end(), bind2nd(not_equal_to<int>(), 1));//bind2nd是函数适配器。可将函数对象作为参数
  13. cout << "the count of 1 in v is " << cnt1 << endl;
  14. cout << "the cnt of not equaling 1 is " << cnt2 << endl;
  15. return 0;
  16. }

for_each 对序列中的每个元素施加由函数f指定的操作

  1. template<class InputIterator, class Function>
  2. Function for_each(InputIterator first, InputIterator last, Function fn)
  3. {
  4. while (first!=last) {
  5. fn (*first);
  6. ++first;
  7. }
  8. return fn; // or, since C++11: return move(fn);
  9. }

例子:

  1. #include <algorithm>
  2. #include <iostream>
  3. #include <vector>
  4. using namespace std;
  5.  
  6. void print(string &s)
  7. {
  8. cout << s << endl;
  9. }
  10.  
  11. int main(void)
  12. {
  13. vector<string> str_v;
  14. str_v.push_back("Clark");
  15. str_v.push_back("Rindt");
  16. str_v.push_back("Senna");
  17. for_each(str_v.begin(), str_v.end(), print);
  18. return 0;
  19. }

可变序列算法(可以修改容器的内容)copy fill generate partition shuffle remove replace reverse swap transform

copy将容器中的元素从一个区间复制到另一个区间
  1. template<class InputIterator, class OutputIterator>
  2. OutputIterator copy (InputIterator first, InputIterator last, OutputIterator result)
  3. {
  4. while (first!=last) {
  5. *result = *first;
  6. ++result; ++first;
  7. }
  8. return result;
  9. }

例子

  1. #include <iostream>
  2. #include <algorithm>
  3. #include <iterator>
  4. #include <vector>
  5. using namespace std;
  6.  
  7. int main(void)
  8. {
  9. int arr[] = {1, 2, 3, 4, 5};
  10. vector<int> v(&arr[0], &arr[5]);
  11. ostream_iterator<int> out(cout, "\n");
  12. copy(v.begin(), v.end(), out);
  13. return 0;
  14. }

partition

对于给定区间[first, last)和一个一元判断函数pred, 类属算法partition可以对该区间内的元素重新排列,以使所有满足判断函数pred的元素排在所有不满足pred的元素前面,该算法还有一个版本stable_partition,能保证分割后的每一组元素的相对位置保持不变,返回值都是一个迭代器,该迭代器代表第一组数据的结尾,同时也是第二组数据的开头
  1. template <class BidirectionalIterator, class UnaryPredicate>
  2. BidirectionalIterator partition (BidirectionalIterator first,
  3. BidirectionalIterator last, UnaryPredicate pred)
  4. {
  5. while (first!=last) {
  6. while (pred(*first)) {
  7. ++first;
  8. if (first==last) return first;
  9. }
  10. do {
  11. --last;
  12. if (first==last) return first;
  13. } while (!pred(*last));
  14. swap (*first,*last);
  15. ++first;
  16. }
  17. return first;
  18. }

例子

  1. #include <iostream>
  2. #include <algorithm>
  3. #include <ctime>
  4. #include <iterator>
  5. #include <algorithm>
  6. #include <sys/time.h>
  7. #include <cstdlib>
  8. using namespace std;
  9.  
  10. struct IsEven //函数对象
  11. {
  12. bool operator()(int x) { return (x&0x01)==1; }
  13. };
  14.  
  15. int myrandom(int i) { return rand()%i; }
  16.  
  17. int main(void)
  18. {
  19. srand((unsigned)time(NULL));
  20. int arr[10];
  21. struct timeval start, end;
  22. for(int i=0; i<10; i++)
  23. arr[i] = i;
  24. random_shuffle(&arr[0], &arr[10], myrandom); //将数组元素打乱
  25. gettimeofday(&start, NULL);
  26. cout << *(partition(&arr[0], &arr[10], IsEven())) << endl; //重排数组,将奇偶数分开
  27. //计算运行时间
  1. gettimeofday(&end, NULL);
  2. float t_time = end.tv_sec-start.tv_sec+(end.tv_usec-start.tv_usec)/1000000.0;
  3. cout << "time used " << t_time << endl;
  4. ostream_iterator<int> out(cout, " ");
  5. copy(&arr[0], &arr[10], out);
  6. cout << endl;
  7. return 0;
  8. }

STL迭代器与部分算法学习笔记的更多相关文章

  1. C / C++算法学习笔记(8)-SHELL排序

    原始地址:C / C++算法学习笔记(8)-SHELL排序 基本思想 先取一个小于n的整数d1作为第一个增量(gap),把文件的全部记录分成d1个组.所有距离为dl的倍数的记录放在同一个组中.先在各组 ...

  2. Manacher算法学习笔记 | LeetCode#5

    Manacher算法学习笔记 DECLARATION 引用来源:https://www.cnblogs.com/grandyang/p/4475985.html CONTENT 用途:寻找一个字符串的 ...

  3. Johnson算法学习笔记

    \(Johnson\)算法学习笔记. 在最短路的学习中,我们曾学习了三种最短路的算法,\(Bellman-Ford\)算法及其队列优化\(SPFA\)算法,\(Dijkstra\)算法.这些算法可以快 ...

  4. 某科学的PID算法学习笔记

    最近,在某社团的要求下,自学了PID算法.学完后,深切地感受到PID算法之强大.PID算法应用广泛,比如加热器.平衡车.无人机等等,是自动控制理论中比较容易理解但十分重要的算法. 下面是博主学习过程中 ...

  5. Johnson 全源最短路径算法学习笔记

    Johnson 全源最短路径算法学习笔记 如果你希望得到带互动的极简文字体验,请点这里 我们来学习johnson Johnson 算法是一种在边加权有向图中找到所有顶点对之间最短路径的方法.它允许一些 ...

  6. 算法学习笔记——sort 和 qsort 提供的快速排序

    这里存放的是笔者在学习算法和数据结构时相关的学习笔记,记录了笔者通过网络和书籍资料中学习到的知识点和技巧,在供自己学习和反思的同时为有需要的人提供一定的思路和帮助. 从排序开始 基本的排序算法包括冒泡 ...

  7. R语言实现关联规则与推荐算法(学习笔记)

    R语言实现关联规则 笔者前言:以前在网上遇到很多很好的关联规则的案例,最近看到一个更好的,于是便学习一下,写个学习笔记. 1 1 0 0 2 1 1 0 0 3 1 1 0 1 4 0 0 0 0 5 ...

  8. 二次剩余Cipolla算法学习笔记

    对于同余式 \[x^2 \equiv n \pmod p\] 若对于给定的\(n, P\),存在\(x\)满足上面的式子,则乘\(n\)在模\(p\)意义下是二次剩余,否则为非二次剩余 我们需要计算的 ...

  9. stl源码剖析 详细学习笔记 算法(1)

    //---------------------------15/03/27---------------------------- //算法 { /* 质变算法:会改变操作对象之值 所有的stl算法都 ...

随机推荐

  1. Robotium源码分析之Instrumentation进阶

    在分析Robotium的运行原理之前,我们有必要先搞清楚Instrumentation的一些相关知识点,因为Robotium就是基于Instrumentation而开发出来的一套自动化测试框架.鉴于之 ...

  2. windows下oracle数据库定时备份与压缩批处理脚本(win7/win2008亲测通过)

    第一种方式:全备份,并直接覆盖原来的备份文件,固定命名. 脚本: @echo off exp system/a123@HZPG file=e:\db_backup\oradata.dmp log=e: ...

  3. 读书笔记—CLR via C#字符串及文本

    前言 这本书这几年零零散散读过两三遍了,作为经典书籍,应该重复读反复读,既然我现在开始写博了,我也准备把以前觉得经典的好书重读细读一遍,并且将笔记整理到博客中,好记性不如烂笔头,同时也在写的过程中也可 ...

  4. 深入分析ENode的内部实现流程和关键地方的幂等设计

    ENode 2.0 - 深入分析ENode的内部实现流程和关键地方的幂等设计 前言 ENode架构图 ENode框架内部实现流程分析 Command的幂等处理 Domain Event持久化时的并发冲 ...

  5. 实现透明渐变的Activity

    如果光是透明全屏的Activity的话,直接继承内置theme即可 <activity android:theme="@android:style/Theme.NoTitleBar.F ...

  6. DSP TMS320C6000基础学习(7)—— Bootloader与VectorTable

    本文主要简单记录C6000在启动装载过程和中断向量表的配置. 1. Bootloader 如上图, (1)在Device Reset阶段: 设备初始化为默认状态,大部分三态输出都配置为高阻态. (2) ...

  7. ThoughtWorks开发持续集成及部署利器:Go

    持续集成及部署利器:Go   Go是一款先进的持续集成和发布管理系统,由ThoughtWorks开发.(不要和Google的编程语言Go混淆了!)其前身为Cruise,是ThoughtWorks在做咨 ...

  8. 建立Ftp站点

    建立Ftp站点步骤: 1.首先创建一个用户 我的电脑右键->管理->本地用户和组->用户->“右键”新建用户->输入用户名和密码再点创建就行了! 2.其次是在C盘新建文件 ...

  9. AIX errpt命令说明

    查看系统的错误记录 在系统运行时,一些系统错误会记录在errlog 中,其中有些错误还会在终端上显示.检查错误日志可用以下命令: # errpt IDENTIFIER  TIMESTAM P  T  ...

  10. 【ios开发】图片拉伸

    最近在做一个项目 其中要自己定制一个View 如图: 但是美工给了我的图片尺寸却是不一样的. 分别是599*80  26*61 于是就成了这样的效果. 很明显的发现取消四周不对劲. 于是我就去找美工姐 ...