STL(Standard Template Library),即标准模板库,是一个具有工业强度的,高效的C++程序库。它被容纳于C++标准程序库(C++ Standard Library)中,是ANSI/ISO C++标准中最新的也是极具革命性的一部分。该库包含了诸多在计算机科学领域里所常用的基本数据结构和基本算法。为广大C++程序员们提供了一个可扩展的 应用框架,高度体现了软件的可复用性。这种现象有些类似于Microsoft Visual C++中的MFC(Microsoft Foundation Class Library),或者是Borland C++ Builder中的VCL(Visual Component Library)
从逻辑层次来看,在STL中体现了泛型化程序设计的思想(generic programming),引入了诸多新的名词,比如像需求(requirements),概念(concept),模型(model),容器 (container),算法(algorithmn),迭代子(iterator)等。与OOP(object-oriented programming)中的多态(polymorphism)一样,泛型也是一种软件的复用技术。
从实现层次看,整个STL是以一种类型参数化(type parameterized)的方式实现的,这种方式基于一个在早先C++标准中没有出现的语言特性--模板(template)。如果查阅任何一个版本 的STL源代码,你就会发现,模板作为构成整个STL的基石是一件千真万确的事情。除此之外,还有许多C++的新特性为STL的实现提供了方便。
没有C++语言就没有STL,这么说毫不为过。一般而言,STL作为一个泛 型化的数拍册据结构和算法库,并不牵涉具体语言(当然,在C++里,它被称为STL)。也就是说段贺渗,如果条件允许,用其他语言也可以实现之。这里所说的条件,主 要是指类似于"模板"这样的语法机制。如果你没有略过前一节内容的话,应该可以看到,Alexander Stepanov在选择C++语言作为实现工具之前,早以采用过多种程序设计语言。但是,为什么最终还是C++幸运的承担了这个历史性任务呢?原因不仅在 于前述那个条件,还在于C++在某些方面所表现出来的优越特性,比如:高效而灵活的指针。但是如果把C++作为一种OOP(Object- Oriented Programming,面向对象程序设计)语言来看待的话(事实上我们一般都是这么认为的,不是吗?),其功能强大的继承握脊机制却没有给STL的实现帮上 多大的忙。在STL的源代码里,并没有太多太复杂的继承关系。继承的思想,甚而面向对象的思想,还不足以实现类似STL这样的泛型库。C++只有在引入了 "模板"之后,才直接导致了STL的诞生。这也正是为什么,用其他比C++更纯的面向对象语言无法实现泛型思想的一个重要原因。当然,事情总是在变化之 中,像Java在这方面,就是一个很好的例子,jdk1.4中已经加入了泛型的特性。
此外,STL对于C++的发展,尤其是模板机制,也起到了促进作用。比如: 模板函数的偏特化(template function partial specialization),它被用于在特定应用场合,为一般模板函数提供一系列特殊化版本。这一特性是继STL被ANSI/ISO C++标准委员会通过之后,在Bjarne和Stepanov共同商讨之下并由Bjarne向委员会提出建议的,最终该项建议被通过。这使得STL中的一 些算法在处理特殊情形时可以选择非一般化的方式,从而保证了执行的效率。STL是最新的C++标准函数库中的一个子集,这个庞大的子集占据了整个库 的大约80%的分量。而作为在实现STL过程中扮演关键角色的模板则充斥了几乎整个C++标准函数库.
在STL还没有降生的"黑暗时代",C++程序员要完成前面所提到的那些功能,需要做很多事情(不过这比起C程序来,似乎好一点),程序大致是如下这个样子的:
#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 = 0cin >>num[n]n ++)
// C标准库中的快速排序(quick-sort)函数
qsort(num, n, sizeof(int), compare)
// 将排序结果输出到标准输出设备
for (int i = 0i <ni ++)
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,看看效果如何。
#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 = 0i <num.size()i ++)
cout <<num[i] <<"\n"
}
这个程序的主要部分改用了STL的部件,看起来要比第一个程序简洁一 点,你已经找不到那个讨厌的compare函数了。这个程序是足够健壮的。
下面我们来看看这个绝版的C++程序。
#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)
推荐资料 <<C++ Templates 中文版>>
《泛型编程与-STL中文版》
《C++ STL 中文版》
《Effective.STL中文版》
STL中容器list的成员搏缺函数merge()合并两个有序的list,
你调用前没有sort()
先排序。
你应基稿辩该调用list的splice()函数
// list::merge
#include <iostream>
#include <list>
// compare only integral part:
bool mycomparison (double first, double second)
{ return ( int(first)<int(second) )}
int main ()
{
std::list<敬肢double>first, second
first.push_back (3.1)
first.push_back (2.2)
first.push_back (2.9)
second.push_back (3.7)
second.push_back (7.1)
second.push_back (1.4)
first.sort()
second.sort()
first.merge(second)
// (second is now empty)
second.push_back (2.1)
first.merge(second,mycomparison)
std::cout <<"first contains:"
for (std::list<double>::iterator it=first.begin()it!=first.end()++it)
std::cout <<' ' <<*it
std::cout <<'\n'
return 0
}
Output:
first contains: 1.4 2.2 2.9 2.1 3.1 3.7 7.1
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)