C++primer U9 读书笔记 顺序容器

顺序容器

vector                 支持快速随机访问                  类似数组,连续存储,除尾部外,插入删除开销较大,需整块移动,提供快速随机访问

list                       支持快速插入/删除                 迭代器只支持++、--以及==、!=运算,类似链表,表示不连续的存储空间,较快的插入删除,随机访问开销大

deque                 双端队列                                 从两端插入和删除元素都非常快,在中间插入删除代价更高。可随机访问

顺序容器适配器

stack                  后进先出(LIFO)堆栈         #include <stack>    ,stack 栈可以建立在vector、list 或者 deque 容器之上

queue                先进先出(FIFO)队列         #include <queue>  ,要求其关联的基础容器必须提供 push_front 运算,因此只能建立在 list 容器上

priority_queue  有优先级管理的队列                                                 ,要求提供随机访问功能,不能建立在 list 容器上。


容器构造函数
C<T> c;                创建一个名为 c 的空容器。C 是容器类型名,如 vector,T 是元素类型,如 int 或 string 适用于所有容器。
C<T> c(c2);         创建容器 c2 的副本 c;c 和 c2 必须具有相同的容器类型,并存放相同类型的元素。适用于所有容器。
C<T> c(b,e);        创建 c,其元素是迭代器 b 和 e 标示的范围内元素的副本。适用于所有容器。
C<T> c(n,t);          用 n 个值为 t 的元素创建容器 c,其中值 t 必须是容器类型 C 的元素类型的值,或者是可转换为该类型的值。只适用于顺序容器
C<T>  c(n);           创建有 n 个值初始化(第 3.3.1 节)(value-initialized)元素的容器 c。只适用于顺序容器


初始化为一段元素的副本

vector<string>::iterator mid = svec.begin() + svec.size()/2;

deque<string> front(svec.begin(), mid);


容器的容器

vector< vector<string> > lines; // ok: space required between close>
vector< vector<string>> lines; // error: >> treated as shiftoperator


迭代器范围

[ first, last )      左开右闭,last指向容器最后一个元素的后一个。begin()、end()


容器定义的类型别名

size_type                                 无符号整型,足以存储此容器类型的最大可能容器长度
iterator                                     此容器类型的迭代器类型
const_iterator                         元素的只读迭代器类型
reverse_iterator                     按逆序寻址元素的迭代器
const_reverse_iterator         元素的只读(不能写)逆序迭代器
difference_type                      足够存储两个迭代器差值的有符号整型,可为负数
value_type                              元素类型
reference                                元素的左值类型,是 value_type& 的同义词
const_reference                    元素的常量左值类型,等效于 const value_type&


在顺序容器中添加元素

c.push_back(t)                       在容器 c 的尾部添加值为 t 的元素。返回 void 类型
c.push_front(t)                        在容器 c 的前端添加值为 t 的元素。返回 void 类型只适用于 list 和 deque 容器类型.
c.insert(p,t)                              在迭代器 p 所指向的元素 前面插入值为 t 的新元素。
c.insert(p,n,t)                           在迭代器 p 所指向的元素前面插入 n 个值为 t 的新元素。返回 void 类型:svec.insert(svec.end(), 10, "Anna");
c.insert(p,b,e)                          在迭代器 p 所指向的元素前面插入由迭代器 b 和 e 标记的范围内的元素。返回 void 类型

                                                   string sarray[4] = {"quasi", "simba", "frollo", "scar"};

                                                    slist.insert(slist.end(), sarray, sarray+4);


避免存储end 操作返回的迭代器   last = v.end();   添加或删除 deque 或vector 容器内的元素都会导致存储的迭代器失效。


顺序容器的大小操作

c.size()                                 返回容器 c 中的元素个数。返回类型为 c::size_type
c.max_size()                       返回容器 c 可容纳的最多元素个数,返回类型为c::size_type

c.empty()                              返回标记容器大小是否为 0 的布尔值
c.resize(n)                           调整容器 c 的长度大小,使其能容纳 n 个元素,如果 n <c.size(),则删除多出来的元素;否则,添加采用值初始化的新元素
c.resize(n,t)                         调整容器 c 的长度大小,使其能容纳 n 个元素。所有新添加的元素值都为 t。resize操作不能用于关联容器(U10)


访问顺序容器内元素的操作

c.back()                              返回容器 c 的最后一个元素的引用。如果 c 为空,则该操作未定义,begin()、end()返回的是迭代器(指针),这两函数返回的是元素值

c.front()                              返回容器 c 的第一个元素的引用。如果 c 为空,则该操作未定义

c[n]                                      返回下标为 n 的元素的引用 如果 n <0 或 n >= c.size(),则该操作未定义 只适用于 vector 和 deque 容器

c.at(n)                                 返回下标为 n 的元素的引用。如果下标越界,则该操作未定义只适用于 vector 和 deque 容器


删除元素

c.erase(p)                         删除迭代器 p 所指向的元素 返回一个迭代器,它指向被删除元素后面的元素。关联容器(U10)erase操作返回void类型

c.erase(b,e)                      删除迭代器 b 和 e 所标记的范围内所有的元素,返回一个迭代器,它指向被删除元素段后面的元素。

c.clear()                              删除容器 c 内的所有元素。返回 void

c.pop_back()                     删除容器 c 的最后一个元素。返回 void。如果 c 为空容器,则该函数未定义

c.pop_front()                     删除容器 c 的第一个元素。返回 void。如果 c 为空容器,则该函数未定义只适用于 list 或 deque 容器


顺序容器的赋值操作

c1 = c2                           删除容器 c1 的所有元素,然后将 c2 的元素复制给 c1。c1 和c2 的类型(包括容器类型和元素类型)必须相同

c1.swap(c2)                  交换内容:调用完该函数后,c1 中存放的是 c2 原来的元素,c2 中存放的则是 c1 原来的元素。c1 和 c2 的类型必须相同。该函数的执行速度通常要比将 c2 复制到 c1 的操作快

c.assign(b,e)                重新设置 c 的元素:,删除容器中原来存储的所有元素。将迭代器 b 和 e 标记的范围内所有的元素复制到 c 中。b 和 e 必须不是指向 c 中元素的迭代器

c.assign(n,t)                 将容器 c 重新设置为存储 n 个值为 t 的元素   关联容器(U10)不支持assign操作


capacity (容量)和 reserve (预留)成员   看不懂的话P440

ivec.capacity()  >=ivec.size()                 每次size==capacity后再push_back() capacity会再度增加>=size

reserve设置大于capacity后,size至reserve大小capacity都不会改变,之后以reserve大小成倍增加


通常来说,除非找到选择使用其他容器的更好理由,否则vector 容器都是最佳选择

如果无法确定某种应用应该采用哪种容器,则编写代码时尝试只使用 vector 和 lists 容器都提供的操作:使用迭代器,而不是下标,并且避免随机访问元素。这样编写,在必要时,可很方便地将程序从使用 vector 容器修改为使用 list 的容器。



容器适配器

所有适配器都定义了两个构造函数:默认构造函数用于创建空对象,和带一个容器参数的构造函数将参数容器的副本作为其基础值。

stack<int> stk(deq); // copies elements from deq into stk


栈适配器

s.empty()        如果栈为空,则返回 true,否则返回 stack

s.size()           返回栈中元素的个数

s.pop()            删除栈顶元素的值,但不返回其值

s.top()             返回栈顶元素的值,但不删除该元素

s.push(item)  在栈顶压入新元素


队列和优先级队列支持的操作

q.empty()                        如果队列为空,则返回 true,否则返回 false
q.size()                           返回队列中元素的个数
q.pop()                            删除队首元素,但不返回其值
q.front()                           返回队首元素的值,但不删除该元素该操作只适用于队列
q.back()                          返回队尾元素的值,但不删除该元素该操作只适用于队列
q.top()                             返回具有最高优先级的元素值,但不删除该元素该操作只适用于优先级队列
q.push(item)                  对于 queue,在队尾压入一个新元素,对于 priority_quue,在基于优先级的适当位置插入新元素

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值