前言
本篇文章是作者本人使用STL 后的一些看法, 对於想要靠此文章学习STL, 是不可能的. 建议叁后面介绍的一些书入门.
STL的概念
在STL 中, 大至上分三个主要的功能. 分别是collect class, (例如 vector ,list , .....), 算法部份(如sort ,find ...), 最是一些工具(如auto_ptr , make_pair ....), 其中以collect class 和算法部份最为重要.
STL 使用一种称作 iterator (中文有人翻作泛型指标) 的资料类型来连接collect class 和算法部份. 为了达到能够重复使用算法和collect class. 在STL 中把这些东西更进一步抽象化. 因此STL订义了一堆抽象化的行为称作concept. 您可以想像concept 是在说明一些行为. 只要某一个型别合乎concept 中说明的行为. 就说此类型具有此concept.
举例说明, 如有concept C1,C2. 算法A1, A2. 资料类型D1 具有C1 的行为,D2 有C1,C2.
如A1 要求需要具有C1 的型别. 则任何一个有C1 的资料类型都可以给A1 使用. 在此例中有D1和D2.
如A2 要求具有C1跟C2的型别. 在此只有D2 可以给A2 使用.
STL 使用抽象化的行为定义且实作它们, 来达到算法和资料类型的重复使用.
iterator 在STL 中是很重要的一个概念, iterator 和C 的point 很相, 但他不是指标(note 在某一些状况下iterator 是以C 的point 来实作). 他提供类似point 的功能, 如 '++' 运算表示把iterator 移到下一个element , '*' 运算表示存取iterator 目前指向的element (在此使用'指向'并不是很好). 利用iterator 你可以走访整个collect 中存放的内容.
举个例子说明iteraotr 的功能吧.
vector 是STL 中众多的collect class 中的一种. vector 提供begin() 和end() 这类的member function 来取得vector 中第一个element 的iterator, 和最后一个element的下一个element. 您可以这样使用:
std::vector<int> vtInt;
vtInt.push_back(1);
...
.. // 假设对vtInt 做了很多不同的动做, 如push_back ...
std::vector<int>::iterator itBegin=vtInt.begin();
std::vector<int>::iterator itEnd=vtInt.end();
for( ; itBegin != itEnd ;++itBegin) // 走访itBegin 到 itEnd 不含itEnd 之间的所有element
{
int x=*itBegin; // 取得itBegin 指向的资料
*itBegin = .... ; // 存放资料到itBegin 指向的资料
}
由此例中iterator 有和C point 类似的功能.
机乎所有的STL 的算法都会要求输入的资料是itearot 如sort 算法, 要求输入两个iterator , 然后把这两个iterator 之间的资料加以排序. 介由引进iterator , sort 可以排序的东西就变多了.
使用范例
I. 在STL 中使用标准输出. Say Hello
#include <iostream> // STL 的输入输出包含档. 在STL 中都没有使用.h or .hpp 等副档名
int main(int argc,char* argv[])
{
std::cout << "Hello!! This is STL " << std::endl; // 使用stl 的标准输出, std 是STL 的namespace 所以要这样用std::cout
return 0;
}
II. 从标准输入读入字串, 排序后再输出
#include <iostream> // STL 的输入输出包含档
#include <algorithm> // STL 的算法包含档
#include <string> // STL 的字串
#include <vector> // STL 的一个collect class 这是一个像阵列的class
const int d_nReadLine=5;
int main(int argc,char* argv[])
{
std::vector<std::string> vtString; // 宣告一个字串vector
std::string strTemp; // 宣告一个字串
for( int i = 0 ; i < d_nReadLine ; i++) // 读取d_nReadLine 个字串并将结果存到vtString 中
{
std::cin >> strTemp; // 读入字串
vtString.push_back(strTemp); // 将读入的字串存到vtString 的最后面
}
std::sort(vtString.begin(),vtString.end()); // 将vtString 中得资料sort
std::copy(vtString.begin(),vtString.end(),
std::ostream_iterator<std::string>(std::cout,"\n")); // 将vtString 中得资料输出
return 0;
}
note :
std::sort 和std::copy 都是STL 提供的算法.
参考书籍
泛型程式设计与STL, Generic Programming and the STL. Matthew H. Austern 着, 侯捷/黄俊尧 译