STL标准模板库的一些知识点汇总 1

STL的六个基本概念:容器(container)、迭代器(iterator)、算法(algorithm)、函数对象(function object)、适配器(adaptor) 和分配器(allocator).

容器

C++标准库提供四种序列容器和四种关联容器,另外三种序列容器适配器。

序列容器

序列容器里的元素保持严格的线性排列,deque , list , vector 是常用的三种序列容器。

容器里有大量的插入及删除操作的情况下优先使用list;在容器头尾有大量插入及删除的情况下优先使用deque容器,其他情况使用vector。

第四种序列容器是basic_string,用于表示字符串。

三个适配器类模板:queue、priority_queue 和 stack 都是类适配器(适配类型)。(另一种适配器为  实例适配器:适配类型的实例)。

任何序列容器类型,只要是CopyConstructible(可复制构造语义,类型T的实例能从类型T的另一个实例复制构造而来,则T是可复制构造的。)

关联容器

关联容器提供基于键的元素查找能力。STL中:map, multimap, set和 multiset. map 和multimap 提供了一种键类型与另一种值类型的关联。


标准库的容器中,只有vector保证其元素的存储空间是连续的,因而,它和C API兼容, 即可以通过 &vector[0] 获取其指向连续数据的指针(数组指针)。

对于std::string (或 std::wstring) 在已知的标准库字符串实现中,无一不采用连续的存储空间,即便如此,其仍不保证其存储空间是连续的,不能使用上述用法。

s所有的标准容器都提供里额swap()方法,可以在常数时间内,通过交换一些成员变量的值,交换同类型容器的内部状态,且该方法保证不抛出异常。(??)


迭代器

迭代器可自增,解引用,可比较。某些迭代器可自减,有些支持指针算术运算。但 并非所有指针操作可用于迭代器。

根据迭代器对指针操作的支持程度,迭代器概念提炼五个类别:输入迭代器(input iterator)、输出迭代器(output iterator)、前向迭代器(forward iterator)、双向迭代器(ibidirectional iterator) 以及随机访问迭代器(random access  iterator). 迭代器类别有时也称为“概念”(concept).

输入迭代器:最基础的一类 非变动性迭代器,支持有限的指针操作。可以默认构造它,拷贝构造它,对它复制赋值,自增它或比较该迭代器类型的两个实例。
输入/输出迭代器有一个重要特性(single-pass)一遍算法:使用输入迭代器的算法 不允许两次经过同一个迭代器。解引用返回的是右值。
输出迭代器是最基础的一类 变动性 迭代器,解引用返回左值,能出现在赋值运算符的左边。
前向(正向)迭代器结合输入输出,参与多次性(multipass)算法。
双向支持自减反向遍历,随机是双向的超集,增加了算术运算,即可以对随机访问迭代器的实例进行下标运算,或者设置偏移量。

迭代器类别

说明

输入

从容器中读取元素。输入迭代器只能一次读入一个元素向前移动,输入迭代器只支持一遍算法,同一个输入迭代器不能两遍遍历一个序列

输出

向容器中写入元素。输出迭代器只能一次一个元素向前移动。输出迭代器只支持一遍算法,统一输出迭代器不能两次遍历一个序列

正向

组合输入迭代器和输出迭代器的功能,并保留在容器中的位置

双向

组合正向迭代器和逆向迭代器的功能,支持多遍算法

随机访问

组合双向迭代器的功能与直接访问容器中任何元素的功能,即可向前向后跳过任意个元素


迭代器操作

说明

所有迭代器

p++

后置自增迭代器

++p

前置自增迭代器

输入迭代器

*p

复引用迭代器,作为右值

p=p1

将一个迭代器赋给另一个迭代器

p==p1

比较迭代器的相等性

p!=p1

比较迭代器的不等性

输出迭代器

*p

复引用迭代器,作为左值

p=p1

将一个迭代器赋给另一个迭代器

正向迭代器

提供输入输出迭代器的所有功能

双向迭代器

--p

前置自减迭代器

p--

后置自减迭代器

随机迭代器

p+=i

将迭代器递增i位

p-=i

将迭代器递减i位

p+i

在p位加i位后的迭代器

p-i

在p位减i位后的迭代器

p[i]

返回p位元素偏离i位的元素引用

p<p1

如果迭代器p的位置在p1前,返回true,否则返回false

p<=p1

p的位置在p1的前面或同一位置时返回true,否则返回false

p>p1

如果迭代器p的位置在p1后,返回true,否则返回false

p>=p1

p的位置在p1的后面或同一位置时返回true,否则返回false

 

只有顺序容器和关联容器支持迭代器遍历,各容器支持的迭代器的类别如下:

容器

支持的迭代器类别

vector

随机访问

deque

随机访问

list

双向

set

双向

multiset

双向

map

双向

multimap

双向

stack

不支持

queue

不支持

priority_queue

不支持



预定义的迭代器适配器

STL不仅定义了迭代器及其五种类别,也定义了数个迭代器适配器。

std::reverse_iterator 是类适配器,用于适配双向 或 随机访问迭代器。
STL定义了迭代器实例适配器: std::back_insert_iterator、 std::front_insert_iterator 及std::insert_iterator 对外提供输出适配器。

另外一种实例适配器是流迭代器,流迭代器以输入、输出迭代器的形式提供了对输入、输出流和流缓冲区的适配:
std::istream_iterator 、 std::ostream_iterator 、 std::istreambuf_iterator 及 std::ostreambuf_iterator.


算法

STL算法是一系列应用于迭代器区间的通用函数模板,算法操作该区间或区间内的元素。
比如std::distance()算法计算区间内元素的个数,并对传给它的迭代器做解引用操作。
        std::transform()算法将一个范围内的元素经过变换后存到另一个给定的容器中。

函数对象

或称仿函数,是一种可调用的对象,它可以是真正的函数,或者是一个定义了函数调用运算符的类的实例。

函数对象主要搭配算法使用,可能作为谓词出现,也可能作为函数出现。

分配器


分配器对内存管理服务的类型应该满足的要求做了描述,分配器最主要的功能,是对容器(及其他需要操作内存的组件)的内存操作细节进行抽象,提供统一的良好定义的接口,使其按照不同的内存服务要求,用不同的分配器特化。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值