标准库体系结构 C++

重复发明轮子并不是一件有创造性的事,站在巨人的肩膀上解决问题会更加有效。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种。 

  1. 前向迭代器只能利用递增运算符进行前向迭代。像unordered_set、unordered_multiset、unordered_map和unordered_multimap这些容器都“至少”是用前向迭代器(某些情况下可以提供双向迭代器)。 
  2. 双向迭代器是可以用递增运算符向前迭代,或者用递减运算符向后迭代。像list、set、multiset、map和multimap的迭代器都是双向迭代器。 
  3. 随机访问迭代器具有双向迭代器的所有属性。此外,他们还可以进行随机访问。这种迭代器本身支持运算操作,可以改变偏移量,也可以利用关系运算符(< 和 >)比较迭代器。像vector、deque、array和string的迭代器都是这类迭代器。 
  4. 输入迭代器能够在迭代时读取或处理一些值。如Input stream iterators。 
  5. 输出迭代器能够在迭代时输出一些值。如Inserters、和output stream iterators。 

(4)分配器    Allocators,为容器分配内存。

(5)适配器    Adaptors。 

1.container adaptor :LIFO stack;FIFO queue;Priority queue

容器适配器提供顺序容器的特殊接口

  1. stack 堆栈适配器(LIFO) 
  2. queue 改写容器来提供队列(FIFO数据结构) 
  3. 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。 算法函数的参数不一定非要是函数。可以是行为类似函数的对象,称为函数对象,或仿函数。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值