C++与STL编程

学C++没用过STL我觉得是任何一个现代C++使用者都无法接受的事情。STL是如此强大,以至于使用以后老C++程序员们习惯的那些代码不见了,出现的是清晰,健壮的代码。

在学习C++ PRIMER 4th EDITION的过程更是体会到STL的魅力,很多低级重复的编程不在存在。

一个稍稍复杂一点的例子,它的大致功能是:从标准输入设备(一般是键盘)读入一些整型数据,然后对它们进行排序,最终将结果输出到标准输出设备(一般是显示器屏幕)。
如果用原始的C++,代码大致如下

[codes=c++]
#include
#include

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;
}
 
[/codes]
而使用STL以后。代码就大变样了。
[codes=c++]
#include
#include
#include

using namespace std;

void main(void)
{
  vector 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";
}
[/codes]
[codes=c++]
#include
#include
#include
#include

using namespace std;

void main(void)
{
  typedef vector        int_vector;
  typedef istream_iterator        istream_itr;
  typedef ostream_iterator        ostream_itr;
  typedef back_insert_iterator< int_vector >  back_ins_itr;

  // STL中的vector容器
  int_vector num;

  // 从标准输入设备读入整数,
  // 直到输入的是非整型数据为止
  copy(istream_itr(cin), istream_itr(), back_ins_itr(num));

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

  // 将排序结果输出到标准输出设备
  copy(num.begin(), num.end(), ostream_itr(cout, “\n”));
}
 
[/codes]
在这个程序里几乎每行代码都是和STL有关的(除了main和那对花括号,当然还有注释),并且它包含了STL中几乎所有的各大部件(容器container,迭代器iterator, 算法algorithm, 适配器adaptor),唯一的遗憾是少了函数对象(functor)的身影。
最后这个程序绝版了。几乎是完美的。。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据