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

输入迭代器(InputIterator)

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

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

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

template<class InputIterator, class UnaryPredicate>
InputIterator find_if (InputIterator first, InputIterator last, UnaryPredicate pred)
{
while (first!=last) {
if (pred(*first)) return first;
++first;
}
return last;
}

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

template <class ForwardIterator>
ForwardIterator adjacent_find (ForwardIterator first, ForwardIterator last)
{
if (first != last)
{
ForwardIterator next=first; ++next;
while (next != last) {
if (*first == *next) // or: if (pred(*first,*next)), for version (2)
return first;
++first; ++next;
}
}
return last;
}

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

template <class InputIterator, class UnaryPredicate>
typename iterator_traits<InputIterator>::difference_type
count (InputIterator first, InputIterator last, UnaryPredicate pred)
{
typename iterator_traits<InputIterator>::difference_type ret = 0;
while (first!=last) {
if (pred(*first)) ++ret;
++first;
}
return ret;
}


count_if:

template <class InputIterator, class UnaryPredicate>
typename iterator_traits<InputIterator>::difference_type
count (InputIterator first, InputIterator last, UnaryPredicate pred)
{
typename iterator_traits<InputIterator>::difference_type ret = 0;
while (first!=last) {
if (pred(*first)) ++ret;
++first;
}
return ret;
}

例子:

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

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

template<class InputIterator, class Function>
Function for_each(InputIterator first, InputIterator last, Function fn)
{
while (first!=last) {
fn (*first);
++first;
}
return fn; // or, since C++11: return move(fn);
}

例子:

#include <algorithm>
#include <iostream>
#include <vector>
using namespace std; void print(string &s)
{
cout << s << endl;
} int main(void)
{
vector<string> str_v;
str_v.push_back("Clark");
str_v.push_back("Rindt");
str_v.push_back("Senna");
for_each(str_v.begin(), str_v.end(), print);
return 0;
}

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

copy将容器中的元素从一个区间复制到另一个区间
template<class InputIterator, class OutputIterator>
OutputIterator copy (InputIterator first, InputIterator last, OutputIterator result)
{
while (first!=last) {
*result = *first;
++result; ++first;
}
return result;
}

例子

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

partition

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

例子

#include <iostream>
#include <algorithm>
#include <ctime>
#include <iterator>
#include <algorithm>
#include <sys/time.h>
#include <cstdlib>
using namespace std; struct IsEven //函数对象
{
bool operator()(int x) { return (x&0x01)==1; }
}; int myrandom(int i) { return rand()%i; } int main(void)
{
srand((unsigned)time(NULL));
int arr[10];
struct timeval start, end;
for(int i=0; i<10; i++)
arr[i] = i;
random_shuffle(&arr[0], &arr[10], myrandom); //将数组元素打乱
gettimeofday(&start, NULL);
cout << *(partition(&arr[0], &arr[10], IsEven())) << endl; //重排数组,将奇偶数分开
//计算运行时间
	gettimeofday(&end, NULL);
float t_time = end.tv_sec-start.tv_sec+(end.tv_usec-start.tv_usec)/1000000.0;
cout << "time used " << t_time << endl;
ostream_iterator<int> out(cout, " ");
copy(&arr[0], &arr[10], out);
cout << endl;
return 0;
}

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. dozer-初识

    1.简介     dozer是一种JavaBean的映射工具,类似于apache的BeanUtils.但是dozer更强大,它可以灵活的处理复杂类型之间的映射.不 但可以进行简单的属性映射.复杂的类型 ...

  2. android 当目录路径从n层按back键退回到n-19层的时候,file manager自己主动退出

    当目录路径从n层按back键退回到n-19层的时候,file manager自己主动退出,比方在63层按back 键退回到44层的时候,file manager自己主动退出.   1.FileMana ...

  3. C# 调用Webservice并传递序列化对象

    原文:C# 调用Webservice并传递序列化对象 C#动态调用WebService注意要点 1.动态调用的url后面注意一定要加上?WSDL   例如:string _url = "ht ...

  4. dom03

    鼠标事件: 键盘事件: //通过class获取元素,封装一个通过class获取元素的方法 //IE10以下不支持document.getElementByClass() function getByC ...

  5. 【iOS】Xib的使用与File&#39;Owner总结

    一.XIB的适用范围 xib(也叫Nib)与storyboard一样是用来描写叙述界面的. storyboard描写叙述的是比較大型的,大范围.适合描写叙述界面跳转等. 二.XIB的使用 Xib是小范 ...

  6. PCL点云库中怎样读取指定的PCD文件,又一次命名,处理后保存到指定目录

    我一直想把处理后的pcd文件重命名,然后放到指定的目录,尝试了好久最终做到了: 比方我想读取  "table_scene_lms400.pcd" 把它进行滤波处理,重命名为 &qu ...

  7. ASP.NET 5+EntityFramework 7

    爱与恨的抉择:ASP.NET 5+EntityFramework 7   EF7 的纠缠 ASP.NET 5 的无助 忘不了你的好 一开始列出的这个博文大纲,让我想到了很久之前的一篇博文:恋爱虽易,相 ...

  8. Xamarin Mono 环境搭建

    Xamarin Mono 环境搭建(使用Visual Studio 2013 开发android 和 ios ) 本文主要介绍Xamarin结合VS2013来开发Android应用程序,主要会介绍Mo ...

  9. Roslyn 编译平台概述

    在Language Feature Status上面看到,其实更新的并不是特别多,为了不会误导看了C# 6.0 功能预览 (一)的园友,现在把官方的更新列表拿了过来,供大家参考 C# 6.0 功能预览 ...

  10. MVC程序中实体框架的连接恢复和命令拦截

    MVC程序中实体框架的连接恢复和命令拦截 这是微软官方SignalR 2.0教程Getting Started with Entity Framework 6 Code First using MVC ...