最近在开始学习STL,记录一些学习的心得和体会,如有不足,期待大家批评指正!
STL(Standard Template Library),即标准模板库,是一个具有工业强度的,高效的C++程序库。该库包含了诸多在计算机科学领域里所常用的基本数据结构和基本算法。为广大C++程序员们提供了一个可扩展的应用框架,高度体现了软件的可复用性。这种现象有些类似于Microsoft Visual C++中的MFC(Microsoft Foundation Class Library),或者是Borland C++ Builder中的VCL(Visual Component Library),对于此二者,大家一定不会陌生吧。
我们可以这样理解:STL的思想其实是将数据和操作分离.它包括:容器(Container),迭代器(iterator),算法(Algorithmn),它体现了泛型化程序设计思想.
废话不多说了,让我们来看看3个程序范例:
第一版:史前时代--转木取火
#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;
}
这是一个和STL没有任何关系的传统C++风格程序.
第二版:工业时代--组件化大生产
#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函数了
第三版:唯美主义的杰作
#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>
using namespace std;
void main(void)
{
typedef vector<int> int_vector;
typedef istream_iterator<int> istream_itr;
typedef ostream_iterator<int> 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"));
}
在这个程序里几乎每行代码都是和STL有关的(除了main和那对花括号,当然还有注释),并且它包含了STL中几乎所有的各大部件(容器 container,迭代器iterator, 算法algorithm, 适配器adaptor),唯一的遗憾是少了函数对象(functor)的身影。
可能大家看完这3个列子,感觉一头雾水.
下面就来讨论下STL中的容器(Container)
容器其实就是具有一些特定特征的数据集合.
它又分为:
vector,deque,list,strings等
vector可以看成动态数组(dynamic Arrary),其特点是可以随机存取元素通过数组下标。它的缺点是往数组头和中间插入元素比较费时,效率不高.
deque相当于一个2端均可以进行元素插入的队列,其往头或尾插入元素都比较高效.
list是一个链表,由于数据为随机存放,取的时候必须遍历所取元素之前的所有节点,取数据元素时,效率不及vector和deque,但对其进行中间插入
元素的时候效率却是最高的,因为不用一个个的将数据往后依次移位,只需将指针的指向进行相应的变更就行.