第3章
常用STL的使用
3.1 STL是什么
当今时代是一个信息时代,科技的发展所带来的便利影响了人们生活中的每个细节,STL就是这个时代组件化大生产的产物。正如其他科技成果一样,C++程序员也应该努力使自己适应并充分利用这个“高科技成果”。
STL是一个标准模板库,是一个高效的C++程序库。接下来将以一个实例程序为例,逐步介绍STL的内容与功能。
假设需要从标准输入(一般是键盘)读入一些整型数据,再对它们排序,然后将结果输出到标准输出设备(一般是显示器屏幕),那程序可以如例3.1所示。
【例3.1】 用原始的方式将一些数据进行排序。
#include<iostream>
#include<stdlib.h>
using namespace
std;
#define max_size
10
// 比较两个数的大小
// 如果比较函数返回大于0,qsort就认为a>b
// 如果比较函数返回等于0,qsort就认为a=b
// 如果比较函数返回小于0,qsort就认为a<b
int cmp(const
void *a,const void *b){
return *(int *)a-*(int *)b;
}
int main(){
int arr[max_size];
int n=0;
// 从标准输入设备中读入整数,同时累计输入个数,直到输入的是非整型数据为止
for(;;n++){
cin>>arr[n];
}
qsort(arr,n,sizeof(int),cmp);
for(int i=0;i<n;i++){
cout<<arr[i]<<"
";
}
return 0;
}
以下是某次运行的结果:
输入:0 9 2 1 5
输出:0 1 2 5 9
例3.1中用了一个可以放10个整数的整型数组,来存放输入的数据,规定从标准输入设备中读入整数,同时累计输入个数,直到输入的是非整型数据为止;还用了C标准库的快速排序quit-sort函数来对输入的整数进行排序,并将排序结果输出到标准输出设备上。
然而,这个程序并不像看起来那么健壮(robust)。如果用户输入的数字数超过max_size所规定的上限,就会出现数组越界问题。为了弥补程序中的这一缺陷,必须采用下述方案中的一种。
(1)采用大容量的静态数据分配。
(2)限定输入的数据个数。
(3)采用动态内存分配。
第一种方案比较简单,所做的只是将max_size改大一点,比如1000或者10?000。但是,严格讲这并不能最终解决问题,隐患仍然存在。此外,分配一个大数组,通常是在浪费空间,因为大多数情况下,数组中的一部分空间并没有被利用。
再来看看第二种方案,通过在第一个for循环中加入一个限定条件,可以使问题得到解决。比如:for (int n = 0; cin >> num[n] && n < max_size; n
++);但是这个方案同样不甚理想,尽管不会使程序崩溃,但失去了灵活性,使用户无法输入更多的数。
看来只有选择第三种方案了,利用指针以及动态内存分配可以妥善解决上述问题,并且使程序具有良好的灵活性。这需要用到new、delete操作符,或者malloc(),realloc()和free()函数,但是为此,程序将牺牲其简洁性,使代码量陡增,代码的处理逻辑也不再像原先看起来那么清晰了。很难保证不会在处理这个问题的时候出错,很多程序的bug往往就是这样产生的。同时,stdlib.h库提供了quit-sort函数,避免了自己实现排序算法的麻烦。总之,需要考虑的问题越来越多。
接下来就将从STL的角度分析并解决这类问题。