如果用户需要反方向迭带遍历整个容器,reverse_iterator适配器可以满足这个要求。库以一种一致的方式扩展了基本的C++范例,因此一个是C/C++的程序员能够很容易的开始使用库。例如,库有一个合并的函数模板。当用户有两个数组ab要合并成c时,可以这样实现:

int a[1000];

int b[2000];

int c[3000];

...

merge(a, a + 1000, b, b + 2000, c);

如果用户想要合并一个vector和一个list(二者都是库中的模板类),并把结果放到一个新申请的未初始化的空间中,可以这样实现:

vector<Employee> a;

list<Employee> b;

...

Employee* c = allocate(a.size() + b.size(), (Employee*)0);

merge(a.begin(), a.end(), b.begin(), b.end(),

raw_storage_iterator<Employee*, Employee>(c));

其中 begin()end()是容器的成员函数,它们返回正确的迭代器类型或者类似指针的对象,该迭代器或对象允许merge去做这项工作.raw_storage_iterator是一个适配器,它允许算法通过调用相应的拷贝构造函数把结果直接放到没有初始化的内存空间中。很多种情况下象通过常规数据结构一样迭带通过整个输入/输出流也是很有用的。例如,如果我们想要合并两个数据结构并把它们存储到一个文件中,那么能够避免为结果产生一个辅助数据结构,而直接把结果存到相应文件中去将是一种很好的方法。库同时提供了istream_iterator ostream_iterator模板类,以便使库的多数算法能够和代表同类数据集合I/O流一起工作。这里是一个从标准输入读取数字文件的程序,移走所有在命令参数不可见的输入,并把结果写到标准的输出中。

main(int argc, char** argv) {

if (argc != 2) throw(”usage: remove_if_divides integer\n”);

remove_copy_if(istream_iterator<int>(cin), istream_iterator<int>(),

ostream_iterator<int>(cout, ”\n”),

not1(bind2nd(modulus<int>(), atoi(argv[1]))));

}

所有的工作都是由remove_copy_if来做的,它一个个读整数直到输入迭代器和流的结束迭代器相等,后者是由无参的构造函数构造的。(一般,所有的算法以一种“从这到那”的方式工作,取两个分别表示输入开始和结束的迭代器做为参数)。然后remove_copy_if通过cout确定的迭代器传递检测到输出流。remove_copy_if使用的函数对象从modulus<int>构造而来,modulus<int>是二元谓词,输入参数Ij,返回I%j。由于remove_copy_if需要的是一元谓词,需要用bind2nd绑定modulus<int>的第二个参数,使之成为一元谓词。这里modulus<int>的第二个参数是命令行参数atoi(argv[1])。然后使用notl函数适配器得到这个一元谓词的否定。

一个更加现实的例子是一个过滤程序,该程序输入一个文件,然后随机的打乱它的行。

main(int argc, char**) {

if (argc != 1) throw(”usage: shuffle\n”);

vector<string> v;

copy(istream_iterator<string>(cin), istream_iterator<string>(),

inserter(v, v.end()));

random_shuffle(v.begin(), v.end());

copy(v.begin(), v.end(), ostream_iterator<string>(cout));

}

这个例子中,copy从标准输入移动行到一个vector中,但是由于这个vector没有提前分配空间,所以它用一个插入的迭代器一行行插入到vector中。(这项技术允许所有的复制函数在常规的覆盖模式和插入模式都能够工作)。然后random_shuffle随机打乱vector并再次调用copy把它复制到cout流中。