 #include 
				"
				stdafx.h
				"
				#include 
				"
				stdafx.h
				"
				
						
						 #ifndef    IOSTREAM_H
#ifndef    IOSTREAM_H
 #include 
				<
				iostream
				>
#include 
				<
				iostream
				>
				
						
						 #endif
				
				#endif
				
						
						 #include 
				<
				vector
				>
#include 
				<
				vector
				>
				
						
						 #include 
				<
				algorithm
				>
#include 
				<
				algorithm
				>
				
						
						 #include 
				<
				iterator
				>
#include 
				<
				iterator
				>
				
						
						 
						
						 using
				 
				namespace
				 std;
				
				using
				 
				namespace
				 std;


 int
				 _tmain(
				int
				 argc, _TCHAR
				*
				 argv[])
				int
				 _tmain(
				int
				 argc, _TCHAR
				*
				 argv[])
				
						 {
				
				
						{
 typedef vector
						<
						int
						>
						                            int_vector;
    typedef vector
						<
						int
						>
						                            int_vector;
 typedef istream_iterator
						<
						int
						>
						                istream_itr;
    typedef istream_iterator
						<
						int
						>
						                istream_itr;
 typedef ostream_iterator
						<
						int
						>
						                ostream_itr;
    typedef ostream_iterator
						<
						int
						>
						                ostream_itr;
 typedef back_insert_iterator
						<
						 int_vector 
						>
						    back_ins_itr;
    typedef back_insert_iterator
						<
						 int_vector 
						>
						    back_ins_itr;

 //
						 STL中的vector容器
    
						//
						 STL中的vector容器
						
								
								 int_vector num;
						
						    int_vector num;

 //
						 从标准输入设备读入整数,
    
						//
						 从标准输入设备读入整数, 
 //
						 直到输入的是非整型数据为止
    
						//
						 直到输入的是非整型数据为止
						
								
								 copy(istream_itr(cin), istream_itr(), back_ins_itr(num));
						
						    copy(istream_itr(cin), istream_itr(), back_ins_itr(num));

 //
						 STL中的排序算法
    
						//
						 STL中的排序算法
						
								
								 sort(num.begin(), num.end());
						
						    sort(num.begin(), num.end());

 //
						 将排序结果输出到标准输出设备
    
						//
						 将排序结果输出到标准输出设备
						
								
								 copy(num.begin(), num.end(), ostream_itr(cout, 
						"
						\n
						"
						));
						
						    copy(num.begin(), num.end(), ostream_itr(cout, 
						"
						\n
						"
						));

 return
						 
						0
						;
    
						return
						 
						0
						;
 }
}
				
		 完全STL的程序
在这个程序里几乎每行代码都是和STL有关的(除了main和那对花括号,当然还有注释),并且它包含了STL中几乎所有的各大部件(容器container,迭代器iterator, 算法algorithm, 适配器adaptor),唯一的遗憾是少了函数对象(functor)的身影。
还记得开头提到的一个典型系统所具有的基本特征吗?--输入+处理+输出。所有这些功能,在上面的程序里,仅仅是通过三行语句来实现的,其中每一行语句对应一种操作。对于数据的操作被高度的抽象化了,而算法和容器之间的组合,就像搭积木一样轻松自如,系统的耦合度被降到了极低点。这就是闪耀着泛型之光的STL的伟大力量。如此简洁,如此巧妙,如此神奇!就像魔术一般,以至于再一次让你摸不着头脑。怎么实现的?为什么在看第二版程序的时候如此清晰的你,又坠入了五里雾中(窃喜)。
请留意此处的标题(唯美主义的杰作),在实际环境中,你未必要做到这样完美。毕竟美好愿望的破灭,在生活中时常会发生。过于理想化,并不是一件好事,至少我是这么认为的。正如前面提到的,这个程序只是为了展示STL的独特魅力,你不得不为它的出色表现所折服,也许只有深谙STL之道的人才会想出这样的玩意儿来。如果你只是一般性的使用STL,做到第二版这样的程度也就可以了。
实在是因为这个程序太过"简单",以至于我无法肯定,在你还没有完全掌握STL之前,通过我的讲解,是否能够领会这区区三行代码,我将尽我的最大努力。
前面提到的迭代器可以对容器内的任意元素进行定位和访问。在STL里,这种特性被加以推广了。一个cin代表了来自输入设备的一段数据流,从概念上讲它对数据流的访问功能类似于一般意义上的迭代器,但是C++中的cin在很多地方操作起来并不像是一个迭代器,原因就在于其接口和迭代器的接口不一致(比如:不能对cin进行++运算,也不能对之进行取值运算--即*运算)。为了解决这个矛盾,就需要引入适配器的概念。istream_iterator便是一个适配器,它将cin进行包装,使之看起来像是一个普通的迭代器,这样我们就可以将之作为实参传给一些算法了(比如这里的copy算法)。因为算法只认得迭代器,而不会接受cin。对于上面程序中的第一个copy函数而言,其第一个参数展开后的形式是:istream_iterator(cin),其第二个参数展开后的形式是:istream_iterator()(如果你对typedef的语法不清楚,可以参考有关的c++语言书籍)。其效果是产生两个迭代器的临时对象,前一个指向整型输入数据流的开始,后一个则指向"pass-the-end value"。这个函数的作用就是将整型输入数据流从头至尾逐一"拷贝"到vector这个准整型数组里,第一个迭代器从开始位置每次累进,最后到达第二个迭代器所指向的位置。或许你要问,如果那个copy函数的行为真如我所说的那样,为什么不写成如下这个样子呢?
copy(istream_iterator<int>(cin), istream_iterator<int>(), num.begin());
	 
你确实可以这么做,但是有一个小小的麻烦。还记得第一版程序里的那个数组越界问题吗?如果你这么写的话,就会遇到类似的麻烦。原因在于copy函数在"拷贝"数据的时候,如果输入的数据个数超过了vector容器的范围时,数据将会拷贝到容器的外面。此时,容器不会自动增长容量,因为这只是简单地拷贝,并不是从末端插入。为了解决这个问题,另一个适配器back_insert_iterator登场了,它的作用就是引导copy算法每次在容器末端插入一个数据。程序中的那个back_ins_itr(num)展开后就是:back_insert_iterator(num),其效果是生成一个这样的迭待器对象。