8、泛型程序设计与c++标准模板库4.标准c++库中的算法
标准c++算法是通过迭代器和模板来实现的,其实算法本身就是一种函数模板。
算法从迭代器那里获得一个元素,而迭代器则知道一个元素在容器中的什么位置。迭代器查找元素的位置并将这些信息提供给算法以便算法能够访问这些元素。算法不必关心具体的元素存储在容器中什么位置的细节,通常情况下,算法也不必直到存储元素的容器的种类。算法只需要简单地申请一个元素就可以了,根本无须直到这个元素是什么或者这个元素可能存储在什么地方。这样的话一个标准的算法就可以处理几乎所有类型的容器,并且一个容器可以容纳几乎任何类型的元素。这种通用化是的程序员可以无需做任何额外的工作就重复地使用代码和解决方案。
STL的算法是通用的,每个算法都适合与若干中不同的数据结构,而不是仅仅能够用一种数据结构。算法不是直接使用容器作为参数,而是使用迭代器类型。这样用户就可以在自己定义的数据结构上应用这些算法,仅仅要求这些自定义容器的迭代器类型满足算法要求。STL中几乎所有算法的头文件都是<algorithm>。
STL标准模板库中的算法大致上可以分为4类:第一类是非可变序列的算法,通常,这类算法在对容器进行操作时不会改变容器的内容;
第二类是可变序列的算法,这类算法一般会改变他们所操作容器的内容;
第三类是排序相关的算法,包括包括排序算法和合并算法、二分查找算法以及有序序列的集合操作算法等;
第四类是通用数值算法,这类算法的数量比较少。
算法是c++标准模板库的另一个核心内容,每种算法又有各自的特点,不可能通过一个算法的应用来展示所有算法的应用特点。
1、STL通用算法调用形式
原型定义形式及使用说明:
template <typename InputIterator,typename InputIteartor>
OutputIterator copy( InputIterator first,InputIterator last,OutputIterator result);
在该函数原型中,InputIterator代表输入型迭代器类型,OutputIterator代表输出型迭代器类型。该算法功能是将区间[first,last)中的元素赋值到区间[result,result+(last-first))中。
ostream_iterator<int> output(count," ");//创建一个输出流迭代器output
cout<<"List col1 contains:";
copy(col1.begin().col1.end(),output);//输出初始列表容器col1中的元素
这里,首先创建一个输出流迭代器output,然后将初始列表容器col1中的元素通过copy函数复制给流迭代器output,从而实现数据的输出。其中,col1.begin()和col1.end()分别指向初始列表容器col1的第一个元素和最后一个元素末尾的位置。
在STL通用算法中,很多算法还包含有一种以函数对象为输入参数的调用形式,比如最常用的排序算法sort就包含有两种调用形式:
第一种形式:
template <typename RandomAccessIterator>
void sort(RandomAccessIterator first,RandomAccessIterator last);
第二种形式:
template <typename RandomAccessIterator,typename Compare>
void sort(RandomAccessIterator first,RandomAccessIterator last,Compare comp);
在这两种调用形式中,第一种采用默认操作符operator<进行比较排序,最终默认情况是按升序排序,而第二种形式是按函数对象comp规定的比较标准进行排序,即可以是升序,也可以是降序,或者其他特定的规则。这样一来,用户可以通过设计相应的函数对象来达到特殊排序的要求,程序设计的灵活性更大。
sort例子:
#include<iostream>
#include<vector>
#include<algorithm>
#include<functional>
#include<iterator>
using namespace std;
int main()
{
int A[] = { 1, 2, 3, 4, 5 };
const int N = sizeof(A) / sizeof(int);
vector<int> col1(A, A + N);
ostream_iterator<int> output(cout, " ");
cout << "Vector col1 contains:";
copy(col1.begin(), col1.end(), output);//输出初始列表容器col1中的元素
sort(col1.begin(), col1.end());//第一种调用形式
cout << "\nafter sorted in ascending order col1 contains:";
copy(col1.begin(), col1.end(), output);//升序排序元素后列表容器col1中的元素
sort(col1.begin(), col1.end(), greater<int>());//第二种调用形式使用标准函数对象
cout << "\nagter sorted in descening ordercol1 contains:";
copy(col1.begin(), col1.end(), output);//降序排列元素后列表容器col1中的元素
getchar();
cout << endl;
}