C++ Primer 学习笔记(6): 泛型算法
2010-03-11 21:54
253 查看
1 泛型算法
所有泛型算法的前两个实参都是一对iterator, 通常被称为first 和 last, 他们标记出要操作的容器或内置数组中的元素范围。
[first, last)
表示从first开始,到last结束,但不包括last。当first==last时范围为空。
1.1 排序和通用整序算法
14个排序和通用整序算法为容器中元素的排序提供了各种策略。分割算法把容器分为两组。第一组由满足某个条件的元素组成,第二组则由不满足条件的元素组成。
inplace_merge(), merge(), nth_element(), partial_sort(), partial_sort_copy(), partition(), random_shuffle(), reverse(), reverse_copy(), rotate(), rotate_copy(), sort(), stable_sort(), stable_partition()
1.2 list
(1)list::merge()
根据底层元素类型的小于操作符或用户指定的比较操作,合并两个已排序的list的元素。
在应用merge()操作以后,list2是空的,list1含有升序排列的15个元素
(2)list::remove()
(3) list::remove_if()
remove_if()操作删除所有满足指定条件为真的元素。例如:
(4) list::reverse()
reverse()操作反向排列list元素
(5)list::sort()
缺省情况下,sort()操作以底层元素类型的小于操作符以升序放置list元素。也可以将一个替换的比较操作符指定为实参。例如:
2 函数对象
函数指针的一种替代策略是Function object(函数对象)。
函数对象与函数指针相比较有两个方面的优点:首先如果被重载的调用操作符是inline函数则编译器能够执行内联编译,提供可能的性能好处;其次函数对象可以拥有任意数目的额外数据,用这些数据可以缓冲结果,也可以缓冲有助于当前操作的数据。
函数对象是一个类,它重载了函数调用操作符operator() ,该操作符封装了一个函数的功能。典型情况下函数对象被作为实参传递给泛型算法,当然我们也可以定义独立的函数对象实例。
所有泛型算法的前两个实参都是一对iterator, 通常被称为first 和 last, 他们标记出要操作的容器或内置数组中的元素范围。
[first, last)
表示从first开始,到last结束,但不包括last。当first==last时范围为空。
1.1 排序和通用整序算法
14个排序和通用整序算法为容器中元素的排序提供了各种策略。分割算法把容器分为两组。第一组由满足某个条件的元素组成,第二组则由不满足条件的元素组成。
inplace_merge(), merge(), nth_element(), partial_sort(), partial_sort_copy(), partition(), random_shuffle(), reverse(), reverse_copy(), rotate(), rotate_copy(), sort(), stable_sort(), stable_partition()
1.2 list
(1)list::merge()
根据底层元素类型的小于操作符或用户指定的比较操作,合并两个已排序的list的元素。
int a1[10] = { 34, 0, 8, 3, 1, 13, 2, 5, 21, 1}; int a2[5] = {377, 89, 233, 55, 144}; list< int > list1( a1, a1+10); list< int > list2( a2, a2+5); //merge要求两个list已排序 list1.sort(); list2.sort(); list1.merge(list2);
在应用merge()操作以后,list2是空的,list1含有升序排列的15个元素
(2)list::remove()
//remove操作删除指定值的全部实例 void list::remove( const elemType &value ); //remove()操作删除指定值的全部实例。例如 //list1.remove(1);
(3) list::remove_if()
remove_if()操作删除所有满足指定条件为真的元素。例如:
class Even{ public: bool operator()(int elem) { return ! ( elem % 2); } }; list1.remove_if(Even());
(4) list::reverse()
reverse()操作反向排列list元素
(5)list::sort()
void list::sort(); template <class Compare> void list::sort( Compare comp);
缺省情况下,sort()操作以底层元素类型的小于操作符以升序放置list元素。也可以将一个替换的比较操作符指定为实参。例如:
//升序排列 list.sort(); //用大于操作符以降序排列 list.sort(greater<int>);
2 函数对象
函数指针的一种替代策略是Function object(函数对象)。
函数对象与函数指针相比较有两个方面的优点:首先如果被重载的调用操作符是inline函数则编译器能够执行内联编译,提供可能的性能好处;其次函数对象可以拥有任意数目的额外数据,用这些数据可以缓冲结果,也可以缓冲有助于当前操作的数据。
函数对象是一个类,它重载了函数调用操作符operator() ,该操作符封装了一个函数的功能。典型情况下函数对象被作为实参传递给泛型算法,当然我们也可以定义独立的函数对象实例。
#include"iostream" #include"vector" #include"algorithm" using namespace std; //用来比较两个数大小的函数对象,使用模板实现 template<class T> class LessThan { public: bool operator()(T a, T b){ return a > b; } }; //打印vector内容 void print(vector<int> &vec) { vector<int>::iterator iter = vec.begin(); for(; iter != vec.end(); iter++){ cout<<*iter<<" "; } cout<<endl; } //筛选数的函数对象 class GreaterThan{ public: //构造函数 GreaterThan( int sz = 50){ _size = sz;} bool operator()(int num){ return num > _size; } private: int _size; }; int main() { vector<int> vec ; //顺序装入100个数,0-99 for(int i = 0; i < 100; i++){ vec.push_back(i); } //打乱vector中的数 random_shuffle(vec.begin(), vec.end()); print(vec); //排序 sort(vec.begin(),vec.end(), LessThan<int>()); print(vec); //vector中大于40的数的个数 int count = count_if(vec.begin(), vec.end(), GreaterThan(40)); cout<<count<<endl; system("pause"); }
相关文章推荐
- 2012/2/3 《C++ Primer Plus》第十四章:C++中的代码重用 学习笔记
- 2012/1/14 《C++ Primer Plus》第六章:分支语句和逻辑操作符 学习笔记
- 《C++ Primer Plus》第2章 开始学习C++ 学习笔记
- 2012/1/21 《C++ Primer Plus》第八章:函数探幽 学习笔记
- c++ primer 学习笔记-第十六章
- 笔记:C++学习之旅---泛型算法
- 《C++ Primer Plus》14.2 私有继承 学习笔记
- [C++ Primer Plus]学习笔记--浮点数的优缺点
- 《C++ Primer Plus》16.1 string类 学习笔记
- 《C++ Primer Plus》第7章 函数——C++的编程模块 学习笔记
- 《C++ Primer Plus》第9章 内存模型和名称空间 学习笔记
- c++ primer plus 学习笔记(1)——复制构造函数与赋值运算符
- 2012/2/11 《C++ Primer Plus》第十七章:输入、输出和文件 学习笔记
- c++学习笔记之复合类型(c++ primer plus)
- 2012/1/31 《C++ Primer Plus》第十三章:类继承 学习笔记
- C++ Primer 学习笔记关于练习题6.12
- 《C++ Primer Plus(第六版)》(1)(第二章 开始学习C++ 笔记和答案)
- 《C++ Primer Plus》第3章 处理数据 学习笔记
- 《C++ Primer Plus》第5章 循环和关系表达式 学习笔记
- 2012/1/27 《C++ Primer Plus》第十二章:类和动态内存分配 学习笔记