2.2.1 第一版:史前时代--转木取火
在STL还没有降生的"黑暗时代",C++程序员要完成前面所提到的那些功能,需要做很多事情(不过这比起C程序来,似乎好一点),程序大致是如下这个样子的:
// name:example2_1.cpp// alias:Rubish#include <stdlib.h>#include <iostream.h>int compare(const void *arg1, const void *arg2);void main(void){const int max_size = 10; // 数组允许元素的最大个数int num[max_size]; // 整型数组// 从标准输入设备读入整数,同时累计输入个数,// 直到输入的是非整型数据为止int n;for (n = 0; cin >> num[n]; n ++);// C标准库中的快速排序(quick-sort)函数qsort(num, n, sizeof(int), compare);// 将排序结果输出到标准输出设备for (int i = 0; i < n; i ++)cout << num[i] << "\n";}// 比较两个数的大小,// 如果*(int *)arg1比*(int *)arg2小,则返回-1// 如果*(int *)arg1比*(int *)arg2大,则返回1// 如果*(int *)arg1等于*(int *)arg2,则返回0int compare(const void *arg1, const void *arg2){return (*(int *)arg1 < *(int *)arg2) ? -1 :(*(int *)arg1 > *(int *)arg2) ? 1 : 0;}
这是一个和STL没有丝毫关系的传统风格的C++程序。因为程序的注释已经很详尽了,所以不需要我再做更多的解释。总的说来,这个程序看起来并不十分复杂(本来就没有太多功能)。只是,那个compare函数,看起来有点费劲。指向它的函数指针被作为最后一个实参传入qsort函数,qsort是C程序库stdlib.h中的一个函数。以下是qsort的函数原型:
void qsort(void *base, size_t num, size_t width, int (__cdecl *compare )(const void *elem1, const void *elem2 ) ); 看起来有点令人作呕,尤其是最后一个参数。大概的意思是,第一个参数指明了要排序的数组(比如:程序中的num),第二个参数给出了数组的大小(qsort没有足够的智力预知你传给它的数组的实际大小),第三个参数给出了数组中每个元素以字节为单位的大小。最后那个长长的家伙,给出了排序时比较元素的方式(还是因为qsort的智商问题)。
以下是某次运行的结果:
输入:0 9 2 1 5
输出:0 1 2 5 9有一个问题,这个程序并不像看起来那么健壮(Robust)。如果我们输入的数字个数超过max_size所规定的上限,就会出现数组越界问题。如果你在Visual C++的IDE环境下以控制台方式运行这个程序时,会弹出非法内存访问的错误对话框。这个问题很严重,严重到足以使你开始重新审视这个程序的代码。为了弥补程序中的这一缺陷。我们不得不考虑采用如下三种方案中的一种:
第一种方案比较简单,你所做的只是将max_size改大一点,比如:1000或者10000。但是,严格讲这并不能