1月上旬——《C++STL》读书笔记 容器

第9章 容器
本章主要概括性地介绍容器,以及容器的时间复杂度和对比
时间复杂度上的比较: 
分类:
1.序列式容器
序列式容器在STL中主要包含常见的三种:向量vector、链表list和双端队列deque。
1.1 向量vector为一种顺序存储同类型元素的数据结构。它是一种数组方式的思路实现,并且可以随机访问的序列。
1.2 链表list是一种实现双向链表数据结构的容器。它只支持顺序访问序列中的元素。该容器在删除、插入相应元素时,效率较高。另外,list可以与vector一样在需要时动态改变其大小。
1.3 双端队列deque是类似向量的一种队列结构。它允许在该队列的头部和尾部插入并且删除相应的元素。同时,它也支持针对其元素的顺序以及随机访问。

2.关联式容器
关联式容器则是采用了key-value键值的方式存储和访问容器中的元素。关联式容器采用红黑树结构,支持快速、随机并且高效的检索其中的元素。关联式容器主要包含set、multiset、map以及multimap容器。

set容器支持随机存取,并且其键与对应的数据元素为同一个值。该容器中所有的元素必须是唯一的,不能包含重复的元素。

multiset容器则在set基础上可以包含重复的元素。同样,该容器的键与对应的元素也是为同一值。

map是一个包含键值对的容器。该容器允许存在重复的键值,但每个键只能与一个值相互对应。

multimap提供单个关键词可以对应多个数据的数据结构操作,

STL还定义了一些容器适配器: 如 stack , queue, priority_queue 

vector
vector的7种初始化方法:
        vector<int> v1;
	vector<int> v2(v1);
	vector<int> v3 = v1;
	vector<int> v4(5, 1);
	vector<int> v5(5);
	vector<int> v6{ 1, 2, 3, 4, 5 };
	vector<int> v7 = { 1, 2, 3, 4, 5 };
pushi_back( )往尾部添加元素
pop_back() 删除最后一个元素
empty( ) 判断是否为空
size( )  存入数据个数
swap()   替换2个vecotr中的元素  
insert()  在指定位置插入数据


vector虽然可以动态增长,但是有两个限制:


不能在范围for循环中向vector添加元素。
任何一种改变vector对象容量的操作会使迭代器失效,即凡是使用了迭代器的循环体,都不要向迭代器所属容器添加元素。


vector的迭代器是随机存取迭代器,两个迭代器之间可以相互比较,加减


第11章<list> 
和vector一样,重载了比较运算符,按照字典顺序比较 vector 中的值 
List将元素按顺序储存在链表中. 与向量(vectors)相比, 它允许快速的插入和删除,但是随机访问却比较慢
assign() 给list赋值 
back() 返回最后一个元素 
begin() 返回指向第一个元素的迭代器 
clear() 删除所有元素 
empty() 如果list是空的则返回true 
end() 返回末尾的迭代器 
erase() 删除一个元素 
front() 返回第一个元素 
insert() 插入一个元素到list中 
max_size() 返回list能容纳的最大元素数量 
merge() 合并两个list 
splice() 合并两个list
pop_back() 删除最后一个元素 
pop_front() 删除第一个元素 
push_back() 在list的末尾添加一个元素 
push_front() 在list的头部添加一个元素 
rbegin() 返回指向第一个元素的逆向迭代器 
remove() 从list删除元素 
remove_if() 按指定条件删除元素 
rend() 指向list末尾的逆向迭代器 
resize() 改变list的大小 
reverse() 把list的元素倒转 
size() 返回list中的元素个数 
sort() 给list排序 
swap() 交换两个list 
unique() 删除list中重复的元素


第12章 deque
deque容器为一个给定类型的元素进行线性处理,像向量一样,它能够快速地随机访问任一个元素,并且能够高效地插入和删除容器的尾部元素。但它又与vector不同,deque支持高效插入和删除容器的头部元素,因此也叫做双端队列。deque类常用的函数如下。
(1)    构造函数
deque():创建一个空deque
deque(int nSize):创建一个deque,元素个数为nSize
deque(int nSize,const T& t):创建一个deque,元素个数为nSize,且值均为t
deque(const deque &):复制构造函数


(2)    增加函数
void push_front(const T& x):双端队列头部增加一个元素X
void push_back(const T& x):双端队列尾部增加一个元素x
iterator insert(iterator it,const T& x):双端队列中某一元素前增加一个元素x
void insert(iterator it,int n,const T& x):双端队列中某一元素前增加n个相同的元素x
void insert(iterator it,const_iterator first,const_iteratorlast):双端队列中某一元素前插入另一个相同类型向量的[forst,last)间的数据
(3)    删除函数
Iterator erase(iterator it):删除双端队列中的某一个元素
Iterator erase(iterator first,iterator last):删除双端队列中[first,last)中的元素
void pop_front():删除双端队列中最前一个元素
void pop_back():删除双端队列中最后一个元素
void clear():清空双端队列中最后一个元素


(4)    遍历函数
reference at(int pos):返回pos位置元素的引用
reference front():返回首元素的引用
reference back():返回尾元素的引用
iterator begin():返回向量头指针,指向第一个元素
iterator end():返回指向向量中最后一个元素下一个元素的指针(不包含在向量中)
reverse_iterator rbegin():反向迭代器,指向最后一个元素
reverse_iterator rend():反向迭代器,指向第一个元素的前一个元素
(5)    判断函数
bool empty() const:向量是否为空,若true,则向量中无元素
(6)    大小函数
Int size() const:返回向量中元素的个数
int max_size() const:返回最大可允许的双端对了元素数量值
(7)    其他函数
void swap(deque&):交换两个同类型向量的数据
void assign(int n,const T& x):向量中第n个元素的值设置为x


第13章 <set>
begin()        ,返回set容器的第一个元素
end()      ,返回set容器的最后一个元素
clear()          ,删除set容器中的所有的元素
empty()    ,判断set容器是否为空
max_size()   ,返回set容器可能包含的元素最大个数
size()      ,返回当前set容器中的元素个数
rbegin     ,返回的值和end()相同
rend()     ,返回的值和rbegin()相同
insert()
find()    
erase()    
clear()
lower_bound(key_value) ,返回第一个大于等于key_value的定位器
upper_bound(key_value),返回最后一个大于等于key_value的定位器


而multiset和set类似,只是可以存储多个相等的数据


第14章<map>
map的基本操作函数:
  C++ Maps是一种关联式容器,包含“关键字/值”对
      begin()          返回指向map头部的迭代器
      clear()         删除所有元素
      empty()          如果map为空则返回true
      end()            返回指向map末尾的迭代器
      erase()          删除一个元素
      find()           查找一个元素
      insert()         插入元素
      lower_bound()    返回键值>=给定元素的第一个位置
      max_size()       返回可以容纳的最大元素个数
      rbegin()         返回一个指向map尾部的逆向迭代器
      rend()           返回一个指向map头部的逆向迭代器
      size()           返回map中元素的个数
      swap()            交换两个map
      upper_bound()     返回键值>给定元素的第一个位置
而multiset和set类似,可以存储键相同的键值对


第15章<stack>
栈是经常使用的数据结构,也非常好理解
empty() 堆栈为空则返回真
pop() 移除栈顶元素
push() 在栈顶增加元素
size() 返回栈中元素数目
top() 返回栈顶元素


第16章 <queue>
队列和栈有相辅相成之妙,也是经常使用的数据结构,模型简单,易于理解。
push(x) 将x压入队列的末端
pop() 弹出队列的第一个元素(队顶元素),注意此函数并不返回任何值
front() 返回第一个元素(队顶元素)
back() 返回最后被压入的元素(队尾元素)
empty() 当队列为空时,返回true
size() 返回队列的长度
而优先级队列底层则是一个堆,每次进行pop或者push时都重新调整堆,外部看来就像是一个排好序的队列(其实并不是,但是可以实现排序的效果),但实质上只保证队头最大(或者最小)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值