博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
从非GP到GP
阅读量:6212 次
发布时间:2019-06-21

本文共 1802 字,大约阅读时间需要 6 分钟。

第一个代码是没有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}

转载地址:http://cccja.baihongyu.com/

你可能感兴趣的文章
通过HTTP协议实现多线程下载
查看>>
java object 转为 json
查看>>
多条件筛选的实现
查看>>
background-size 导致的背景不居中问题
查看>>
Robot framework+python安装使用图解版
查看>>
【Spring学习笔记-MVC-3.1】SpringMVC返回Json数据-方式1-扩展
查看>>
LDA-math-神奇的Gamma函数
查看>>
cocos2d-x注意事项(十)Lua发展飞机战争-4-创建主角
查看>>
[HIS] HIT行业常用名词及缩写定义
查看>>
Git 学习笔记--拉取远程分支到本地
查看>>
jquery插件layer
查看>>
[BI基础] 一些不得不了解的概念
查看>>
【转载】mvc3部署
查看>>
Pat(Advanced Level)Practice--1043(Is It a Binary Search Tree)
查看>>
(一)----使用HttpClient发送HTTP请求(通过get方法获取数据)
查看>>
spring security原理图及其解释
查看>>
Redis安全
查看>>
17秋 软件工程 团队第五次作业 Alpha Scrum9
查看>>
DIV和SPAN的区别
查看>>
Jodd
查看>>