您的位置:首页 > 编程语言 > C语言/C++

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的元素。

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");
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: