从非GP到GP

简介: 第一种方案比较简单,你所做的只是将max_size改大一点,比如:1000或者10000。但是,严格讲这并不能最终解决问题,隐患仍然存在。假如有人足够耐心,还是可以使你的这个经过纠正后的程序崩溃的。此外,分配一个大数组,通常是在浪费空间,因为大多数情况下,数组中的一部分空间并没有被利用。
第一个代码是没有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";
}
目录
相关文章
|
4月前
|
机器学习/深度学习 数据采集 人工智能
优化Alpaca大模型
7月更文挑战第21天
61 2
|
6月前
|
算法
数据包络分析(DEA)——BCC模型
数据包络分析(DEA)——BCC模型
1252 0
|
人工智能 搜索推荐 BI
GJR5251200R0101 07EA90-SI
GJR5251200R0101 07EA90-SI
41 0
PG12/GP7操作符+的实现
PG12/GP7操作符+的实现
63 0
|
关系型数据库
PG/GP limit...offset...实现机制
PG/GP limit...offset...实现机制
116 0
KUC720AE101 3BHB000652R0101 执行所有或部分所需的操作
KUC720AE101 3BHB000652R0101 执行所有或部分所需的操作
109 0
KUC720AE101  3BHB000652R0101 执行所有或部分所需的操作
|
存储
KUC720AE101 3BHB003431R0101 从程序存储器中读取
KUC720AE101 3BHB003431R0101 从程序存储器中读取
123 0
KUC720AE101 3BHB003431R0101 从程序存储器中读取
|
存储 数据安全/隐私保护 异构计算
KUC711AE 3BHB004661R0001 通常用于支持部分重新配置
KUC711AE 3BHB004661R0001 通常用于支持部分重新配置
124 0
  KUC711AE 3BHB004661R0001 通常用于支持部分重新配置
|
存储 机器学习/深度学习 算法
Lec3 基于模型的 CF | 学习笔记
快速学习 Lec3 基于模型的 CF 。
Lec3 基于模型的 CF | 学习笔记
|
监控 Serverless 云计算
基于函数FC的一键应用
Serverless称为微服务运算,但不代表它真的不需要服务,而是说开发者再也不用过多考虑服务器的问题,计算资源作为服务而不是服务器的概念出现。Serverless是一种构建和管理基于微服务架构的技术,允许开发者在服务部署级别而不是服务器部署级别来管理应用部署,你甚至可以管理某个具体功能或端口的部署,以便让开发者快速迭代,更快速地开发软件。
基于函数FC的一键应用