C++ STL编程轻松入门 4

 2.2.2 第二版:工业时代--组件化大生产 ios

  咱们应该庆幸本身所生活的年代。工业时代,科技的发展所带来的巨大便利已经影响到了咱们生活中的每一个细节。若是你还在以原始人类的方式生活着,那我真该怀疑你是否属于某个生活在非洲或者南美丛林里的原始部落中的一员了,难道是玛雅文明又重现了?程序员

  STL即是这个时代的产物,正如其余科技成果同样,C++程序员也应该努力使本身适应并充分利用这个"高科技成果"。让咱们从新审视初版的那个破烂不堪的程序。试着使用一下STL,看看效果如何。web

// 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";
}

  这个程序的主要部分改用了STL的部件,看起来要比第一个程序简洁一点,你已经找不到那个讨厌的compare函数了。它真的能很好的运行吗?你能够试试,由于程序的运行结果和前面的大体差很少,因此在此略去。我能够向你保证,这个程序是足够健壮的。不过,可能你尚未彻底看明白程序的代码,因此我须要为你解释一下。毕竟,这个戏法变得太快了,较之第一个程序,一眨眼的功夫,那些老的C++程序员所熟悉的代码都不见了,取而代之的是一些新鲜玩意儿。算法

  程序的前三行是包含的头文件,它们提供了程序所要用到的全部C++特性(包括输入输出处理,STL中的容器和算法)。没必要在乎那个.h,并非个人疏忽,程序保证能够编译经过,只要你的C++编译器支持标准C++规范的相关部分。你只须要把它们看做是一些普通的C++头文件就能够了。事实上,也正是如此,若是你对这个变化细节感兴趣的化,能够留意一下你身旁的佐餐。数组

  一样能够忽略第四行的存在。加入那个声明只是为了代表程序引用到了std这个标准名字空间(namespace),由于STL中的那些玩意儿全都包含在那里面。只有经过这行声明,编译器才能容许你使用那些有趣的特性。函数

  程序中用到了vector,它是STL中的一个标准容器,能够用来存放一些元素。你能够把vector理解为int [?],一个整型的数组。之因此大小未知是由于,vector是一个能够动态调整大小的容器,当容器已满时,若是再放入元素则vector会悄悄扩大本身的容量。push_back是vector容器的一个类属成员函数,用来在容器尾端插入一个元素。main函数中第一个while循环作的事情就是不断向vector容器尾端插入整型数据,同时自动维护容器空间的大小。组件化

  sort是STL中的标准算法,用来对容器中的元素进行排序。它须要两个参数用来决定容器中哪一个范围内的元素能够用来排序。这里用到了vector的另两个类属成员函数。begin()用以指向vector的首端,而end()则指向vector的末端。这里有两个问题,begin()和end()的返回值是什么?这涉及到STL的另外一个重要部件--迭代器(Iterator),不过这里并不须要对它作详细了解。你只须要把它看成是一个指针就能够了,一个指向整型数据的指针。相应的sort函数声明也能够看做是void sort(int* first, int* last),尽管这实际上很不精确。另外一个问题是和end()函数有关,尽管前面说它的返回值指向vector的末端,但这种说法不能算正确。事实上,它的返回值所指向的是vector中最末端元素的后面一个位置,即所谓pass-the-end value。这听起来有点费解,不过没必要在乎,这里只是稍带一提。总的来讲,sort函数所作的事情是对那个准整型数组中的元素进行排序,一如第一个程序中的那个qsort,不过比起qsort来,sort彷佛要简单了许多。spa

  程序的最后是输出部分,在这里vector彻底能够以假乱真了,它所提供的对元素的访问方式简直和普通的C++内建数组如出一辙。那个size函数用来返回vector中的元素个数,就至关于第一个程序中的变量n。这两行代码直观的不用我再多解释了。指针

  我想个人耐心讲解应该可使你大体看懂上面的程序了,事实上STL的运用使程序的逻辑更加清晰,使代码更易于阅读。试问,有谁会不明白begin、end、size这样的字眼所表达的含义呢(除非他不懂英语)?试着运行一下,看看效果。再试着多输入几个数,看看是否会发生数组越界现象。实践证实,程序运行良好。是的,因为vector容器自行维护了自身的大小,C++程序员就不用操心动态内存分配了,指针的错误使用毕竟会带来不少麻烦,同时程序也会变得冗长无比。这正是前面第三种方案的缺点所在。code

  再仔细审视一下你的第一个STL版的C++程序,回顾一下第一章所提到的那些有关STL的优势:易于使用,具备工业强度……,再比较一下初版的程序,我想你应该有所体会了吧!

相关文章
相关标签/搜索