C++ 泛型算法及迭代器概述
2014-08-14 04:05
211 查看
作者:马哈鱼
原文地址:http://www.cnblogs.com/mahy/archive/2011/10/20/2218546.html
算法基于迭代器及其操作实现,而非基于容器操作。这就暗示着,算法也许会修改容器内的元素值,或者在容器内移动元素,但是算法本身从不直接添加或删除元素。理解算法的最基本方法是了解该算法是否读元素、写元素或者对元素进行重新排序。
1, 只读算法
a)accumulate
int sum = accumulate(v.begin(),v.end(),23);以23为基数,将v容器中的所有元素累加;
string sum = accumulate(v.begin(),v.end(),string(""));以空字符串开始,将v中的每个字符串连接起来;
注:*accumulate对要处理的容器内元素的类型一无所知,故必须传递一个起始值作为第三个参数,再者,容器内元素类型必须与起始值类型相同或可以转换为起始值的类型。
b)find_first_of(v.begin(),v.end(),v2.begin(),v2.end());在第一个范围内查找与第二个范围内的任一元素像匹配的元素,如果找到,返回一个指向第一个匹配元素的迭代器,否则,返回第一个范围的end迭代器。
注:*v和v2的容器类型不必相同,只要两个容器内的元素类型可以提供相等操作符(==)即可。
2, 写容器算法
使用写容器算法,必须确保容器足以存储要写入的元素。
a)fill(v.begin(),v.end(),t);将指定范围内的元素都设置为给定的值;
b)fill_n(v.begin(),n,t);从指定的位置开始,将指定数量的元素设为给定的值t;
注:*指定范围内的元素必须存在。
c)copy(v.begin(),v.end(),v2.begin());从输入范围中读取元素,然后复制到目标容器中;
d)replace(v.begin(),v.end(),2,1);将指定范围内值为2的元素值替换为1;
e)replace_copy(v.begin(),v.end(),v2.begin(),2,1);不修改v的元素值,v2保存v的副本,并将v2中值为2的用手指替换为1;
3, 排序算法
a)sort(v.begin(),v.end());
b)stable_sort(v.begin(),v.end(),sortRule());
c)count_if(v.begin(),v.end(),countRule())
4, 迭代器
除了标准库定义的不依赖于特定容器的迭代器之外,还有三种迭代器:插入迭代器,iostream迭代器和反向迭代器。
a)插入迭代器:与容器绑定在一起,可在容器中插入元素。
back_inserter(v);返回一个能在v容器上实现push_back操作的迭代器;
front_inserter(v);返回一个能在v容器上实现push_front操作的迭代器;
注:*只有当容器v提供push_front操作时,才能使用front_inserter。
inserter(v,it);返回一个插入迭代器,该插入迭代器能在容器v上迭代器it所指向的元素前面插入元素。
b)流迭代器:将对应的流看做特定类型的元素序列。
istream_iterator<T> in(strm);创建从流strm中读取T类型对象的istream_iterator对象in;
istream_iterator<T> in;istream_iterator对象的超出末端迭代器;
ostream_iterator<T> out(strm);创建将T类型对象写到输出流strm的ostream_iterator对象out;
ostream_iterator<T> out(strm,delim);创建将T类型对象写到输出流strm的ostream_iterator对象out,在写入过程中用delim作为元素的分隔符,delim为C风格字符串;
注:*流迭代器只定义了最基本的操作:自增、解引用和赋值。此外,可比较两个 istream 迭代器是否相等(或不等),而 ostream 迭代器则不提供比较运算。
*不可能从ostream_iterator中读取,也不可能向istream_iterator中写入;
*一旦给ostream_iterator对象赋了值,就无法再更改,且每个不同的值正好只能输出一次;
*ostream_iterator没有->操作符。
c)反向迭代器:rbegin 和 rend 成员,分别返回指向容器尾元素和首元素前一位置。自增往左,自减往右。[v.begin(),v.end())和[v.rbegin(),v.rend())标示的都是同一范围内的元素,只是起 始位置和结束位置正好相反。
原文地址:http://www.cnblogs.com/mahy/archive/2011/10/20/2218546.html
算法基于迭代器及其操作实现,而非基于容器操作。这就暗示着,算法也许会修改容器内的元素值,或者在容器内移动元素,但是算法本身从不直接添加或删除元素。理解算法的最基本方法是了解该算法是否读元素、写元素或者对元素进行重新排序。
1, 只读算法
a)accumulate
int sum = accumulate(v.begin(),v.end(),23);以23为基数,将v容器中的所有元素累加;
string sum = accumulate(v.begin(),v.end(),string(""));以空字符串开始,将v中的每个字符串连接起来;
注:*accumulate对要处理的容器内元素的类型一无所知,故必须传递一个起始值作为第三个参数,再者,容器内元素类型必须与起始值类型相同或可以转换为起始值的类型。
b)find_first_of(v.begin(),v.end(),v2.begin(),v2.end());在第一个范围内查找与第二个范围内的任一元素像匹配的元素,如果找到,返回一个指向第一个匹配元素的迭代器,否则,返回第一个范围的end迭代器。
注:*v和v2的容器类型不必相同,只要两个容器内的元素类型可以提供相等操作符(==)即可。
2, 写容器算法
使用写容器算法,必须确保容器足以存储要写入的元素。
a)fill(v.begin(),v.end(),t);将指定范围内的元素都设置为给定的值;
b)fill_n(v.begin(),n,t);从指定的位置开始,将指定数量的元素设为给定的值t;
注:*指定范围内的元素必须存在。
c)copy(v.begin(),v.end(),v2.begin());从输入范围中读取元素,然后复制到目标容器中;
d)replace(v.begin(),v.end(),2,1);将指定范围内值为2的元素值替换为1;
e)replace_copy(v.begin(),v.end(),v2.begin(),2,1);不修改v的元素值,v2保存v的副本,并将v2中值为2的用手指替换为1;
3, 排序算法
a)sort(v.begin(),v.end());
b)stable_sort(v.begin(),v.end(),sortRule());
c)count_if(v.begin(),v.end(),countRule())
4, 迭代器
除了标准库定义的不依赖于特定容器的迭代器之外,还有三种迭代器:插入迭代器,iostream迭代器和反向迭代器。
a)插入迭代器:与容器绑定在一起,可在容器中插入元素。
back_inserter(v);返回一个能在v容器上实现push_back操作的迭代器;
front_inserter(v);返回一个能在v容器上实现push_front操作的迭代器;
注:*只有当容器v提供push_front操作时,才能使用front_inserter。
inserter(v,it);返回一个插入迭代器,该插入迭代器能在容器v上迭代器it所指向的元素前面插入元素。
b)流迭代器:将对应的流看做特定类型的元素序列。
istream_iterator<T> in(strm);创建从流strm中读取T类型对象的istream_iterator对象in;
istream_iterator<T> in;istream_iterator对象的超出末端迭代器;
ostream_iterator<T> out(strm);创建将T类型对象写到输出流strm的ostream_iterator对象out;
ostream_iterator<T> out(strm,delim);创建将T类型对象写到输出流strm的ostream_iterator对象out,在写入过程中用delim作为元素的分隔符,delim为C风格字符串;
注:*流迭代器只定义了最基本的操作:自增、解引用和赋值。此外,可比较两个 istream 迭代器是否相等(或不等),而 ostream 迭代器则不提供比较运算。
*不可能从ostream_iterator中读取,也不可能向istream_iterator中写入;
*一旦给ostream_iterator对象赋了值,就无法再更改,且每个不同的值正好只能输出一次;
*ostream_iterator没有->操作符。
c)反向迭代器:rbegin 和 rend 成员,分别返回指向容器尾元素和首元素前一位置。自增往左,自减往右。[v.begin(),v.end())和[v.rbegin(),v.rend())标示的都是同一范围内的元素,只是起 始位置和结束位置正好相反。
相关文章推荐
- C++语法基础--泛型算法(generic algorithm)--iostream迭代器
- C++学习笔记28——泛型算法之iostream迭代器
- C++第十五天泛型算法和迭代器
- C++学习之泛型算法概述--摘自C++primer4
- C++学习笔记29——泛型算法之插入迭代器
- C++ 学习笔记(10)泛型算法、lambda表达式、bind函数、迭代器
- C++STL总结(附带容器迭代器泛型算法详情链接【未完成】)
- C++语法基础--泛型算法(generic algorithm)--反向迭代器,reverse_iterator::base()
- C++语法基础--泛型算法(generic algorithm)--插入迭代器back_inserter(),front_insertor(),inserter()以及next()函数简介
- C++泛型算法之向算法传递参数
- C++ 插入迭代器,算法使用
- [C++ STL] 一个泛型算法的设计
- Data Structures with C++ Using STL Chapter 3算法概述---笔记
- C++学习之标准库泛型算法_STL算法
- C++语法基础--泛型算法(generic algorithm)--对容器排序的算法sort(),stable_sort(),unique()
- c++学习9之泛型算法
- 容器、迭代器、泛型算法综合小实例
- C++ 学习笔记 2.1 : 容器和算法(顺序容器、关联容器、泛型算法)
- Data Structures with C++ Using STL Chapter 3算法概述---笔记
- C++语法基础--泛型算法(generic algorithm)--replace_copy(),unique_copy,copy()