通过对C++的特性,类和对象的学习和C++的内存管理对C++基本上有了全面的认识,但是C++的核心在于
STL
STL
简介STL
STL
(Standard Template Library,标准模板库)是C++编程语言中一个功能强大的模板库,它提供了一系列通用的数据结构和算法。STL
的设计基于泛型编程,这意味着它使用模板来编写独立于任何特定数据类型的代码。STL
的核心组件包括容器(如向量、链表、集合等)、迭代器、算法、函数对象和适配器等。STL
版本HP STL
:由Alexander Stepanov
和Meng Lee
在惠普实验室完成的原始版本,是所有STL实现版本的始祖。PJ STL
:由P. J. Plauge
r开发,继承自HP版本,被Windows Visual C++采用。SGI STL
:由Silicon Graphics Computer Systems, Inc公司开发,继承自HP版本,被GCC
(Linux)采用,可移植性好,可公开、修改甚至贩卖。STLport
:由Boris Fomitchev
开发,继承自SGI STL
,旨在提供一个可移植到不同平台的STL
版本STL
为什么可以成为C++标准库的一部分STL
利用C++的模板机制实现了泛型编程,使得容器和算法能够处理不同类型的数据,提高了代码的重用性和灵活性。 !STL
提供了多种容器类,如向量(vector)、链表(list)、双端队列(deque)、集合(set)、映射(map)等,这些容器具有高效的数据存储和访问方式,并且可以方便地进行插入、删除和查找等操作。STL
的容器和算法都使用迭代器来访问和操作元素,迭代器提供了统一的接口,使得算法可以独立于具体的数据类型进行操作STL
提供了一系列算法库,包括排序、查找、合并、堆操作、数值算法等,这些算法都被实现为函数模板,可以方便地应用于不同的容器和数据类型。STL
的算法库中使用了函数对象(Functor)来封装操作,通过函数对象,STL
可以将自定义的操作应用于算法中,提高了代码的可定制性和扩展性。STL
的容器类和算法库都采用了自动的内存管理机制,有效避免了内存泄漏和访问越界等问题。STL
六大组件int
,可能需要一个优化过的打印函数,而对于其他类型则使用通用模板定义。在学习C语言的时候如果实现两个数交换 比如:整形,浮点型,字符,会写三个函数。
void Swap(int& left, int& right) { int temp = left; left = right; right = temp; } void Swap(double& left, double& right) { double temp = left; left = right; right = temp; } void Swap(char& left, char& right) { char temp = left; left = right; right = temp; }
这样重复性的代码,是很多人讨厌的地方,正因为这个出现了泛型编程。以上的代码一个用一个函数模板替代,交给编译器实现。
template void Swap(T& a, T& b) { int tmp = a; a = b; b = tmp; }
//在调用这三个函数的时候编译器底层调用的函数地址是不样的 int a = 1; int b = 2; int c = 1.0; int d = 2.0; int e = 'e'; int f = 'f'; Swap(a, b); Swap(c, d); Swap(e, f); 23: Swap(a, b); 00007FF760C019EE lea rdx,[b] 00007FF760C019F2 lea rcx,[a] 00007FF760C019F6 call Swap (07FF760C012F8h) 00007FF760C019FB nop 24: Swap(c, d); 00007FF760C019FC lea rdx,[d] 00007FF760C01A00 lea rcx,[c] 00007FF760C01A04 call Swap (07FF760C012F8h) 00007FF760C01A09 nop 25: Swap(e, f); 00007FF760C01A0A lea rdx,[f] 00007FF760C01A11 lea rcx,[e] 00007FF760C01A18 call Swap (07FF760C012F8h) 00007FF760C01A1D nop
函数模板是一个蓝图,它本身并不是函数,是编译器用使用方式产生特定具体类型函数的模具。所以其实模 板就是将本来应该我们做的重复的事情交给了编译器
类模板是一种强大的编程技术,它允许开发者定义泛型类,这些类可以在创建时指定不同的数据类型。
template
:用于声明模板的开始。< >
内,定义了模板的类型参数或非类型参数。类型参数通常使用typename
或class
关键字声明。template class MyClass { public: T member; MyClass(T initialValue) : member(initialValue) {} // 其他成员函数和类型定义 };
例如,如果有一个模板函数 template
,当调用 f(1, 2)
时,编译器会自动实例化一个 f
的函数版本。
//写出一个模板 template void Swap(T& a, T& b) { int tmp = a; a = b; b = tmp; } //在调用f(1,1),会生成 int swap(int& a,int& b) int swap(int& a,int b) { int tmp = a; a = b; b = tmp; }
//写出一个模板 template void Swap(T& a, T& b) { int tmp = a; a = b; b = tmp; } //在调用f(1.0,1.0),会生成 int swap(float& a,float& b) int swap(float& a,float& b) { int tmp = a; a = b; b = tmp; }