从非GP到GP

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

None.gif#include <stdlib.h>
None.gif#include <iostream.h>
None.gif
None.gif int compare( const  void *arg1,  const  void *arg2);
None.gif
None.gif void main( void)
ExpandedBlockStart.gif {
InBlock.gif    const int max_size = 10;        // 数组允许元素的最大个数
InBlock.gif
    int num[max_size];            // 整型数组
InBlock.gif
InBlock.gif    
// 从标准输入设备读入整数,同时累计输入个数,
InBlock.gif    
// 直到输入的是非整型数据为止
InBlock.gif
    int n;
InBlock.gif    for (n = 0; cin >> num[n]; n ++);
InBlock.gif
InBlock.gif    // C标准库中的快速排序(quick-sort)函数
InBlock.gif
    qsort(num, n, sizeof(int), compare);
InBlock.gif
InBlock.gif    // 将排序结果输出到标准输出设备
InBlock.gif
    for (int i = 0; i < n; i ++)
InBlock.gif        cout << num[i] << "\n";
ExpandedBlockEnd.gif}

None.gif
None.gif //  比较两个数的大小,
None.gif
//  如果*(int *)arg1比*(int *)arg2小,则返回-1
None.gif
//  如果*(int *)arg1比*(int *)arg2大,则返回1
None.gif
//  如果*(int *)arg1等于*(int *)arg2,则返回0
None.gif
int compare( const  void *arg1,  const  void *arg2)
ExpandedBlockStart.gif {
InBlock.gif    return    (*(int *)arg1 < *(int *)arg2) ? -1 :
InBlock.gif            (*(int *)arg1 > *(int *)arg2) ? 1 : 0;
ExpandedBlockEnd.gif}

None.gif

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

第一种方案比较简单,你所做的只是将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后的代码:

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

None.gif#include <iostream>
None.gif#include <vector>
None.gif#include <algorithm>
None.gif
None.gif using  namespace std;
None.gif
None.gif void main( void)
ExpandedBlockStart.gif {
InBlock.gif    vector<int> num;        // STL中的vector容器
InBlock.gif
    int element;
InBlock.gif
InBlock.gif    // 从标准输入设备读入整数, 
InBlock.gif    
// 直到输入的是非整型数据为止
InBlock.gif
    while (cin >> element)
InBlock.gif        num.push_back(element);
InBlock.gif
InBlock.gif    // STL中的排序算法
InBlock.gif
    sort(num.begin(), num.end());
InBlock.gif
InBlock.gif    // 将排序结果输出到标准输出设备
InBlock.gif
    for (int i = 0; i < num.size(); i ++)
InBlock.gif        cout << num[i] << "\n";
ExpandedBlockEnd.gif}
目录
相关文章
|
12月前
|
机器学习/深度学习 人工智能 监控
UR8FH    A404k    P0926GX FBM233
UR8FH    A404k    P0926GX FBM233
72 0
|
SQL 关系型数据库 数据库
PG/GP group by expression语法
PG/GP group by expression语法
105 1
PG12/GP7操作符+的实现
PG12/GP7操作符+的实现
57 0
|
关系型数据库
PG/GP limit...offset...实现机制
PG/GP limit...offset...实现机制
105 0
|
SQL NoSQL 数据库
GPDB中gp_vmem_protect_limit参数的意义
GPDB中gp_vmem_protect_limit参数的意义
163 0
|
存储
KUC720AE101 3BHB003431R0101 从程序存储器中读取
KUC720AE101 3BHB003431R0101 从程序存储器中读取
114 0
KUC720AE101 3BHB003431R0101 从程序存储器中读取
KUC720AE101 3BHB000652R0101 执行所有或部分所需的操作
KUC720AE101 3BHB000652R0101 执行所有或部分所需的操作
103 0
KUC720AE101  3BHB000652R0101 执行所有或部分所需的操作
|
芯片
imx6ull的GPIO操作方法
imx6ull的GPIO操作方法
283 0
imx6ull的GPIO操作方法
成功解决smtplib.SMTPAuthenticationError: (535, b'Error: \xc7\xeb\xca\xb9\xd3\xc3\xca\xda\xc8\xa8\xc2\xeb
成功解决smtplib.SMTPAuthenticationError: (535, b'Error: \xc7\xeb\xca\xb9\xd3\xc3\xca\xda\xc8\xa8\xc2\xeb