zl程序教程

您现在的位置是:首页 >  APP

当前栏目

后台开发:核心技术与应用实践3.1 STL是什么

2023-03-09 22:20:32 时间

第3章


常用STL的使用


3.1 STL是什么


当今时代是一个信息时代,科技的发展所带来的便利影响了人们生活中的每个细节,STL就是这个时代组件化大生产的产物。正如其他科技成果一样,C++程序员也应该努力使自己适应并充分利用这个“高科技成果”。

STL是一个标准模板库,是一个高效的C++程序库。接下来将以一个实例程序为例,逐步介绍STL的内容与功能。

假设需要从标准输入(一般是键盘)读入一些整型数据,再对它们排序,然后将结果输出到标准输出设备(一般是显示器屏幕),那程序可以如例3.1所示。

【例3.1】 用原始的方式将一些数据进行排序。

#include<iostream>

#include<stdlib.h>

using namespace std;

#define max_size 10

// 比较两个数的大小

// 如果比较函数返回大于0,qsort就认为a>b

// 如果比较函数返回等于0,qsort就认为a=b

// 如果比较函数返回小于0,qsort就认为a<b

int cmp(const void *a,const void *b){

    return *(int *)a-*(int *)b;

}

int main(){

    int arr[max_size];

    int n=0;

    // 从标准输入设备中读入整数,同时累计输入个数,直到输入的是非整型数据为止

    for(;;n++){

        cin>>arr[n];

    }

    qsort(arr,n,sizeof(int),cmp);

    for(int i=0;i<n;i++){

        cout<<arr[i]<<" ";

    }

    return 0;

}

以下是某次运行的结果:

输入:0 9 2 1 5

输出:0 1 2 5 9

例3.1中用了一个可以放10个整数的整型数组,来存放输入的数据,规定从标准输入设备中读入整数,同时累计输入个数,直到输入的是非整型数据为止;还用了C标准库的快速排序quit-sort函数来对输入的整数进行排序,并将排序结果输出到标准输出设备上。

然而,这个程序并不像看起来那么健壮(robust)。如果用户输入的数字数超过max_size所规定的上限,就会出现数组越界问题。为了弥补程序中的这一缺陷,必须采用下述方案中的一种。

(1)采用大容量的静态数据分配。

(2)限定输入的数据个数。

(3)采用动态内存分配。

第一种方案比较简单,所做的只是将max_size改大一点,比如1000或者10?000。但是,严格讲这并不能最终解决问题,隐患仍然存在。此外,分配一个大数组,通常是在浪费空间,因为大多数情况下,数组中的一部分空间并没有被利用。

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

看来只有选择第三种方案了,利用指针以及动态内存分配可以妥善解决上述问题,并且使程序具有良好的灵活性。这需要用到new、delete操作符,或者malloc(),realloc()和free()函数,但是为此,程序将牺牲其简洁性,使代码量陡增,代码的处理逻辑也不再像原先看起来那么清晰了。很难保证不会在处理这个问题的时候出错,很多程序的bug往往就是这样产生的。同时,stdlib.h库提供了quit-sort函数,避免了自己实现排序算法的麻烦。总之,需要考虑的问题越来越多。

接下来就将从STL的角度分析并解决这类问题。