牵着老婆满街逛

严以律己,宽以待人. 三思而后行.
GMail/GTalk: yanglinbo#google.com;
MSN/Email: tx7do#yahoo.com.cn;
QQ: 3 0 3 3 9 6 9 2 0 .

从非GP到GP

第一个代码是没有STL时候的代码:
// 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,则返回0
int compare(const void *arg1, const void *arg2)
{
    
return    (*(int *)arg1 < *(int *)arg2) ? -1 :
            (
*(int *)arg1 > *(int *)arg2) ? 1 : 0;
}


如果要考虑到健壮性,可以有以下方案:
  • 采用大容量的静态数组分配。
  • 限定输入的数据个数。
  • 采用动态内存分配。

第一种方案比较简单,你所做的只是将max_size改大一点,比如:1000或者10000。但是,严格讲这并不能最终解决问题,隐患仍然存在。假如有人足够耐心,还是可以使你的这个经过纠正后的程序崩溃的。此外,分配一个大数组,通常是在浪费空间,因为大多数情况下,数组中的一部分空间并没有被利用。

再来看看第二种方案,通过在第一个for循环中加入一个限定条件,可以使问题得到解决。比如:for (int n = 0; cin >> num[n] && n < max_size; n ++); 但是这个方案同样不甚理想,尽管不会使程序崩溃,但失去了灵活性,你无法输入更多的数。

看来只有选择第三种方案了。是的,你可以利用指针,以及动态内存分配妥善的解决上述问题,并且使程序具有良好的灵活性。这需要用到new,delete操作符,或者古老的malloc(),realloc()和free()函数。但是为此,你将牺牲程序的简洁性,使程序代码陡增,代码的处理逻辑也不再像原先看起来那么清晰了。一个compare函数或许就已经令你不耐烦了,更何况要实现这些复杂的处理机制呢?很难保证你不会在处理这个问题的时候出错,很多程序的bug往往就是这样产生的。同时,你还应该感谢stdlib.h,它为你提供了qsort函数,否则,你还需要自己实现排序算法。如果你用的是冒泡法排序,那效率就不会很理想。……,问题真是越来越让人头疼了!

下面再来看看STL后的代码:

// name:example2_2.cpp
// alias:The first STL program

#include 
<iostream>
#include 
<vector>
#include 
<algorithm>

using namespace std;

void main(void)
{
    vector
<int> num;        // STL中的vector容器
    int element;

    
// 从标准输入设备读入整数, 
    
// 直到输入的是非整型数据为止
    while (cin >> element)
        num.push_back(element);

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

    
// 将排序结果输出到标准输出设备
    for (int i = 0; i < num.size(); i ++)
        cout 
<< num[i] << "\n";
}

posted on 2006-04-24 09:39 杨粼波 阅读(417) 评论(0)  编辑 收藏 引用 所属分类: 学习笔记


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理