重复发明轮子并不是一件有创造性的事,站在巨人的肩膀上解决问题会更加有效。STL基本体系结构泛型编程最经典的运用,内核分析同事会给出标准库中标准规范。这个标准库和C标注库不同,C标准库基本是独立的,但是C++的STL标准库六大组件是相互耦合关系在一起。
C++包含了C语言的所有特性,也包含了C语言的库。所以,C++标准库包含两部分。一,标准函数库。这个库由通用的、独立的、不属于任何类的函数组成,继承自C语言。二,面向对象库。这个库是类及其相关函数的集合。C++标准库包含了所有的C标准库,为了支持类型安全做了一定的添加和修改。
成熟的GCC编译器环境构成图
C语言兼容库和C++标准库中的C库子模块功能是重复的,但是它们所包含的头文件是不一样的。
C++标准库以head files形式呈现。在使用过程中需要有以下几点:
(1)C++标注库的header files不带文件后缀.h,例如:#include <vector>
(2)新式C头文件不带有.h后缀,替换为名字前加'C'字符,例如:#include <cstdio>;以前的旧式头文件包含方式仍然可以使用,例如:#include <stdio.h>。
当然在使用新式的标准库文件是它包含std标注库命名空间或者是某个具体的命名空间都是可以的。例如:using namespace std或者using namespace std::cout。
C++ 标准库可以分为两部分:
- 标准函数库: 这个库是由通用的、独立的、不属于任何类的函数组成的。函数库继承自 C 语言。
- 面向对象类库: 这个库是类及其相关函数的集合。STL
C++ 标准库包含了所有的 C 标准库,为了支持类型安全,做了一定的添加和修改。
1. 标准函数库
标准函数库分为以下几类:
- 输入/输出 I/O
- 字符串和字符处理
- 数学
- 时间、日期和本地化
- 动态分配
- 其他
- 宽字符函数
2. 面向对象类库(STL)
标准的 C++ 面向对象类库定义了大量支持一些常见操作的类,比如输入/输出 I/O、字符串处理、数值处理。面向对象类库包含以下内容:
- 标准的 C++ I/O 类
- String 类
- 数值类
- STL 容器类
- STL 算法
- STL 函数对象
- STL 迭代器
- STL 分配器
- 本地化库
- 异常处理类
- 杂项支持库
2.1 STL六大组件
# include <iostream>
# include <vector>
# include <algorithm>
# include <functional>
using namespace std;
using namespace std;
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
int main(int argc, char** argv) {
int ia[6] = { 27,210,12,47,109,83 };
vector<int, allocator<int>> vi(ia, ia + 6);
//********容器 vector 分配器 allocator********
//vector 4种初始化
//std::vector<int> first; // empty vector of ints
//std::vector<int> second(4, 100); // four ints with value 100
//std::vector<int> third(second.begin(), second.end()); // iterating through second
//std::vector<int> fourth(third); // a copy of third
cout << count_if(vi.begin(), vi.end(), not1(bind2nd(less<int>(), 40))) << endl;
//算法 count_if 迭代器 vi.begin() 仿函数 less 适配器 not1 bind2nd
return 0;
}
组件 | 描述 |
---|---|
容器(Containers) | 容器是用来管理某一类对象的集合。C++ 提供了各种不同类型的容器,比如 deque、list、vector、map 等。 |
算法(Algorithms) | 算法作用于容器。它们提供了执行各种操作的方式,包括对容器内容执行初始化、排序、搜索和转换等操作。 |
迭代器(iterators) | 迭代器用于遍历对象集合的元素。这些集合可能是容器,也可能是容器的子集。 |
(1)容器 Containers,存放数据结构。
用来管理某个特定对象的集合。每一种容器都有自己的优点和缺点,在项目中根据不同的需求,使用不同的容器。容器可以是数组、链表或者类字典。
(2)算法 Algorithms,进行数据处理的模板函数
用来处理的元素的集合。例如,可以进行搜索、排序等操作。
STL提供了一些标准算法来处理集合元素。这些算法一般提供最基本的功能,如搜索、排序、复制、修改和数值处理。
算法不是容器类的成员函数,而是全局函数。算法可以操作不同容器类型的元素,甚至可以操作用户自定义的容器类型。总之,既减少了代码量,又增强了性能。
(3)迭代器 Iterators, 相当一种泛化的指针。
用于遍历对象集合的元素。这些集合可以是容器或容器的子集。每一个容器类都提供了它自己的迭代器类型。
根据迭代器所支持的操作,一般分为下面5种。
- 前向迭代器只能利用递增运算符进行前向迭代。像unordered_set、unordered_multiset、unordered_map和unordered_multimap这些容器都“至少”是用前向迭代器(某些情况下可以提供双向迭代器)。
- 双向迭代器是可以用递增运算符向前迭代,或者用递减运算符向后迭代。像list、set、multiset、map和multimap的迭代器都是双向迭代器。
- 随机访问迭代器具有双向迭代器的所有属性。此外,他们还可以进行随机访问。这种迭代器本身支持运算操作,可以改变偏移量,也可以利用关系运算符(< 和 >)比较迭代器。像vector、deque、array和string的迭代器都是这类迭代器。
- 输入迭代器能够在迭代时读取或处理一些值。如Input stream iterators。
- 输出迭代器能够在迭代时输出一些值。如Inserters、和output stream iterators。
(4)分配器 Allocators,为容器分配内存。
(5)适配器 Adaptors。
1.container adaptor :LIFO stack;FIFO queue;Priority queue
容器适配器提供顺序容器的特殊接口
- stack 堆栈适配器(LIFO)
- queue 改写容器来提供队列(FIFO数据结构)
- priority_queue 改写容器来提供优先级队列
2.iterator adaptor : move_iterator
任何操作起来像迭代器的东西都可以当作迭代器。所以可以写出像迭代器的一些类但又执行不一样的操作。C++标准库提供的一些预定义的特殊迭代器,即迭代器适配器。
一般分为四类:
Insert iterators也称为inserters,用来将“赋值新值”操作转换为“安插新值”操作。通过这种迭代器,算法可以执行安插(insert)行为而非覆盖(overwrite)行为。所有Insert迭代器都隶属于Output迭代器类型,所以它只提供赋值(assign)新值的能力。通常算法会将数值赋值给目的迭代器,如copy()算法
Stream iterators是一种迭代器配接器,可以把stream当成算法的原点和终点。更明确的说,一个istream迭代器可以用来从input stream中读元素,而一个ostream迭代器可以用来对output stream写入元素。Stream迭代器的一种特殊形式是所谓的stream缓冲区迭代器,用来对stream缓冲区进行直接读取和写入操作。
Reverse iterators重新定义递增运算和递减运算,使其行为正好倒置。
Move iterators很像一个底层迭代器(必须至少有一个InputIterator)。如果这个迭代器被当作输入迭代器来用,要注意的是,值的操作是移动而不是复制。
(6)functor Adaptor
仿函数 Functors。 算法函数的参数不一定非要是函数。可以是行为类似函数的对象,称为函数对象,或仿函数。