STL迭代器与部分算法学习笔记
迭代器是类似指针的对象,分为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
- 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
- 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迭代器与部分算法学习笔记的更多相关文章
- C / C++算法学习笔记(8)-SHELL排序
原始地址:C / C++算法学习笔记(8)-SHELL排序 基本思想 先取一个小于n的整数d1作为第一个增量(gap),把文件的全部记录分成d1个组.所有距离为dl的倍数的记录放在同一个组中.先在各组 ...
- Manacher算法学习笔记 | LeetCode#5
Manacher算法学习笔记 DECLARATION 引用来源:https://www.cnblogs.com/grandyang/p/4475985.html CONTENT 用途:寻找一个字符串的 ...
- Johnson算法学习笔记
\(Johnson\)算法学习笔记. 在最短路的学习中,我们曾学习了三种最短路的算法,\(Bellman-Ford\)算法及其队列优化\(SPFA\)算法,\(Dijkstra\)算法.这些算法可以快 ...
- 某科学的PID算法学习笔记
最近,在某社团的要求下,自学了PID算法.学完后,深切地感受到PID算法之强大.PID算法应用广泛,比如加热器.平衡车.无人机等等,是自动控制理论中比较容易理解但十分重要的算法. 下面是博主学习过程中 ...
- Johnson 全源最短路径算法学习笔记
Johnson 全源最短路径算法学习笔记 如果你希望得到带互动的极简文字体验,请点这里 我们来学习johnson Johnson 算法是一种在边加权有向图中找到所有顶点对之间最短路径的方法.它允许一些 ...
- 算法学习笔记——sort 和 qsort 提供的快速排序
这里存放的是笔者在学习算法和数据结构时相关的学习笔记,记录了笔者通过网络和书籍资料中学习到的知识点和技巧,在供自己学习和反思的同时为有需要的人提供一定的思路和帮助. 从排序开始 基本的排序算法包括冒泡 ...
- R语言实现关联规则与推荐算法(学习笔记)
R语言实现关联规则 笔者前言:以前在网上遇到很多很好的关联规则的案例,最近看到一个更好的,于是便学习一下,写个学习笔记. 1 1 0 0 2 1 1 0 0 3 1 1 0 1 4 0 0 0 0 5 ...
- 二次剩余Cipolla算法学习笔记
对于同余式 \[x^2 \equiv n \pmod p\] 若对于给定的\(n, P\),存在\(x\)满足上面的式子,则乘\(n\)在模\(p\)意义下是二次剩余,否则为非二次剩余 我们需要计算的 ...
- stl源码剖析 详细学习笔记 算法(1)
//---------------------------15/03/27---------------------------- //算法 { /* 质变算法:会改变操作对象之值 所有的stl算法都 ...
随机推荐
- Robotium源码分析之Instrumentation进阶
在分析Robotium的运行原理之前,我们有必要先搞清楚Instrumentation的一些相关知识点,因为Robotium就是基于Instrumentation而开发出来的一套自动化测试框架.鉴于之 ...
- windows下oracle数据库定时备份与压缩批处理脚本(win7/win2008亲测通过)
第一种方式:全备份,并直接覆盖原来的备份文件,固定命名. 脚本: @echo off exp system/a123@HZPG file=e:\db_backup\oradata.dmp log=e: ...
- 读书笔记—CLR via C#字符串及文本
前言 这本书这几年零零散散读过两三遍了,作为经典书籍,应该重复读反复读,既然我现在开始写博了,我也准备把以前觉得经典的好书重读细读一遍,并且将笔记整理到博客中,好记性不如烂笔头,同时也在写的过程中也可 ...
- 深入分析ENode的内部实现流程和关键地方的幂等设计
ENode 2.0 - 深入分析ENode的内部实现流程和关键地方的幂等设计 前言 ENode架构图 ENode框架内部实现流程分析 Command的幂等处理 Domain Event持久化时的并发冲 ...
- 实现透明渐变的Activity
如果光是透明全屏的Activity的话,直接继承内置theme即可 <activity android:theme="@android:style/Theme.NoTitleBar.F ...
- DSP TMS320C6000基础学习(7)—— Bootloader与VectorTable
本文主要简单记录C6000在启动装载过程和中断向量表的配置. 1. Bootloader 如上图, (1)在Device Reset阶段: 设备初始化为默认状态,大部分三态输出都配置为高阻态. (2) ...
- ThoughtWorks开发持续集成及部署利器:Go
持续集成及部署利器:Go Go是一款先进的持续集成和发布管理系统,由ThoughtWorks开发.(不要和Google的编程语言Go混淆了!)其前身为Cruise,是ThoughtWorks在做咨 ...
- 建立Ftp站点
建立Ftp站点步骤: 1.首先创建一个用户 我的电脑右键->管理->本地用户和组->用户->“右键”新建用户->输入用户名和密码再点创建就行了! 2.其次是在C盘新建文件 ...
- AIX errpt命令说明
查看系统的错误记录 在系统运行时,一些系统错误会记录在errlog 中,其中有些错误还会在终端上显示.检查错误日志可用以下命令: # errpt IDENTIFIER TIMESTAM P T ...
- 【ios开发】图片拉伸
最近在做一个项目 其中要自己定制一个View 如图: 但是美工给了我的图片尺寸却是不一样的. 分别是599*80 26*61 于是就成了这样的效果. 很明显的发现取消四周不对劲. 于是我就去找美工姐 ...