STL库的学习笔记——基本概念总览

STL六大组件

1.容器 container //是一种数据结构,如list,vector,和deques等,以模板类的方法提供。为了访问容器中的数据,可以使用由容器类输出的迭代器。
2.迭代器 iterator //提供了访问容器中对象的方法。迭代器就如同一个指针。
3.容器适配器 adapter
4.算法 algorithm //是用来操作容器中的数据的模板函数。
5.函数对象 functor
6.空间配置器 allocator //配置器隐藏在底层,感觉不到配置器的存在.主要工作包括两部分1.对象的创建与销毁 2.内存的获取与释放
这里写图片

容器(container)

STL的容器可以分为以下几个大类

序列容器 有vector, list, deque, string.
关联容器 有set, multiset, map, mulmap, hash_set, hash_map, hash_multiset, hash_multimap
其他的杂项 stack, queue, valarray, bitset

STL各个容器的简介

vector
内部数据结构:数组
随机访问每个元素,所需要的时间为常量
在末尾增加或删除元素所需时间与元素数目无关,在中间或开头增加或者删除元素所需时间随元素数目呈线性变化
可动态增加或者减少元素,内存管理自动完成,但程序员可以使用reserve()成员函数来管理内存
vector的迭代器在内存重新分配时将失效,因为它所指向的元素在该操作的前后不再相同)。把超过capacity()-size()个元素插入vector中时,内存会重新分配,所有的迭代器都将失效,否则,指向当前元素以后的任何元素的迭代器都将失效,当删除元素时,指向被删除元素以后的任何元素的迭代器都将失效。
deque
内部数据结构:数组
随机访问每个元素,所需时间为常量
在开头和末尾增加元素所需时间与元素的数目无关,在中间增加或者删除元素所需时间随元素数目呈线性变化。
可以动态增加或者减少元素,内存管理自动完成,不提供内存管理员的成员函数。
增加任何元素都将使deque的迭代器失效,在deque的中间删除元素将使迭代器失效。在deque的头或尾删除元素时,只有指向该元素的迭代器失效。
list
内部数据结构:双向环状链表
不能随机访问一个元素
在开头,结尾和中间任何地方增加或删除元素所需时间都为常量
可动态增加或者减少元素,内存管理自动完成。
增加任何元素都不会使迭代器失效,删除元素时,除了指向当前被删除元素的迭代器外,其他迭代器都不会失效
slist
内部数据结构:单向链表。
不可双向遍历,只能从前到后地遍历。
不能随机访问一个元素
在开头,中间,结尾增加或删除的时间都为常量
可动态增加或者减少元素,内存管理自动完成
增加任何元素都不会使迭代器失效,删除元素时,除了指向当前被删除元素的迭代器外,其他迭代器都不会失效
stack
适配器,他可以将任何类型的序列容器(vector,list,deque,string)转化为一个堆栈,一般使用deque作为支持的序列容器。
元素只能先进后出。
不能遍历整个stack。
queue
适配器,它可以将任意类型的序列容器(vector,list,deque,string)转化为一个队列,一般使用deque作为支持的序列容器。
元素只能先进先出。
不能遍历整个queue。
priority_queue
适配器,可以将任意类型的序列容器转化为一个优先级队列,一般使用vector作为底层存储方式。
只能访问第一个元素,不能遍历整个priority_queue。
第一个元素始终是优先级最高的一个元素。
set
键唯一。
键和值相等。
元素默认按升序排列。
如果迭代器所指向的元素被删除,则该迭代器失效。其它任何增加、删除元素的操作都不会使迭代器失效。
multiset
键可以不唯一。
键和值相等。
元素默认按升序排列。
如果迭代器所指向的元素被删除,则该迭代器失效。其他任何增加,删除元素的操作都不会使迭代器失效。
hash_set
键唯一。
与set相比较,它里面的元素不一定是经过排序的,而是按照所用的hash函数分派的,它能提供更快的搜索速度(当然跟hash函数有关)。
如果迭代器所指向的元素被删除,则该迭代器失效。其他任何增加,删除元素的操作都不会使迭代器失效。
hash_multiset
键可以不唯一。
与set相比较,它里面的元素不一定是经过排序的,而是按照所用的hash函数分派的,它能提供更快的搜索速度(当然跟hash函数有关)。
如果迭代器所指向的元素被删除,则该迭代器失效。其他任何增加,删除元素的操作都不会使迭代器失效。
map
键唯一。
元素默认按键的升序排列。
如果迭代器所指向的元素被删除,则该迭代器失效。其它任何增加、删除元素的操作都不会使迭代器失效。
multimap
键可以不唯一。
元素默认按键的升序排列。
如果迭代器所指向的元素被删除,则该迭代器失效。其它任何增加、删除元素的操作都不会使迭代器失效。
hash_map
与map相比较,它里面的元素不一定是按键值排序的,而是按照所用的hash函数分派的,它能提供更快的搜索速度(当然也跟hash函数有关)。
其它特点与map相同。
hash_multimap
键可以不唯一。
其它特点与hash_map相同。

STL各个容器的基本实现方法

容器模板的使用基本有下面的六个步骤:
1. 添加相应的头文件(如#include)(.h没有)
2. 添加std命名空间(用using namespace std;)
3. 赋予模板的具体使用类型(typedef listLISTER;)
4. 实列化模板。(LISTER test;)
5. 实列化游标。(LISTER::iterator i;)
6. 通过迭代器对象访问模板对象//逐个输出链表test的元素
for(i=test.begin();i!=test.end();++i)
cout<<*i<<” “;
容器模板中的常用函数
assign() 赋值
empty() 清空容器若容器为空则返回非零值
erase() 删除指定位置或者范围内的元素
push_front() 从容器头部插入元素
push_back() 从容器尾部插入元素
pop_front() 删除第一个元素
pop_back() 删除最后一个元素
back() 返回最后一个元素的引用
front() 返回第一个元素的引用
begin() 返回指向第一个元素的游标(与迭代器配合使用)
end() 返回指向最后一个元素的后一个位置的游标(最后一个元素再加1)(与迭代器配合使用)

注明:以上全部拼凑加转载,侵删

猜你喜欢

转载自blog.csdn.net/Greek_1999/article/details/81590798