C++学习笔记(六)----关于顺序容器
顺序容器有三种:vector线性表,list链表,deque双端队列.
--------------------------------------------------
容器元素的初始化
1.C<T> c;默认构造函数,只有这一种构造函数不用指定元素个数,下面的其它方法都显示或者隐式指出了元素个数.
2.C c(c2);c2和c的容器类型和元素类型都必须相同.
3.C c(b,e);迭代器b,e所指向的容器的类型不必和C的类型相同,他们的元素类型也不必完全相同,只要相互兼容就可以了.这里的从b到e是左闭合区间[ ),也就是包括b不包括e.
4.C c(n,t);
5.C c(n); 如果容器的元素类型有自定义的构造函数但没有提供默认的构造函数,就不能用这种方法初始化.
--------------------------------------------------
迭代器
1.指向list的迭代器不能比较大小(只能比较是否相等),也不能做减法,也不能加减n.
2.迭代器范围一般都是左闭合区间[first,last).
3.任何指向已删除元素的迭代器都具有无效值.
--------------------------------------------------
顺序容器的操作
1.reverse_iterator是按逆序寻址元素的迭代器,对它做++就是使迭代器向前移.
类似的有c.rbegin()和c.rend()这两个逆序迭代器,分别指向容器的最后一个元素和第一个元素前面的位置.
2.const_前缀使得迭代器不能改变所指向元素的值.
3.value_type在以后写泛型程序的时候会很有用.
4.vector容器不能进行push_front操作.
5.c.insert(p,t)在迭代器p所指元素前插入值为t的新元素,返回指向新添加元素的迭代器.
6.c.insert(p,n,t)是插入n个值为t的元素;c.insert(p,b,e)是插入从[b,e)中的元素.这两个操作都返回void类型.
7.尽量不要存储end操作返回的迭代器.(自己看情况呗.)
8.怎么比较两个容器是不是相同呢?首先这两个容器的类型,元素类型都相同才有的比.然后就一个元素一个元素的比.至于元素的比较是其元素类型定义的.(因此,如果元素类型没有定义关系运算,那么存放这类元素的容器之间不能比较.)不存在比任何值都小.(因此是初始子序列的那个容器更小.)
9.c.max_size()返回c最多可容纳的元素个数,c这辈子最多只能容纳这么多元素了,而capacity是指当前已经分配了多少空间给容器先用着.
10.c.resize(n) 如果n比原来的size小,从后面删掉c.size()-n个元素,如果n更大,在后面添加采用值初始化的新元素;c.resize(n,t)跟它的区别就是指定了初始值.
11.front和back成员直接返回元素的引用.也就是说*c.begin()==c.front().
12.front(),back(),[],at(n)这些操作都要求容器非空,否则操作没有定义 .
13.以前说过了,at函数比下标好的地方就是越界的时候会抛出out_of_range异常.
14.c.erase(p)和c.erase(b,e)操作都返回一个指向被删除元素(段)后面的元素的迭代器.c.erase(p)中的p如果指向末端的下一位置,函数未定义;但c.erase(b,e)中的e如果指向末端的下一位置,函数返回的迭代器也指向末端的下一位置.这是因为[b,e)是左闭合区间.
15.c.pop_front()不能用于vector容器.
16.容器可以直接用”=”赋值.(容器类型和元素类型都要相同)
17.swap操作也要求容器类型和元素类型都要相同,而且使用swap交换元素后,不会使原本指向这两个容器中的元素的迭代器失效,只不过他们都变成指向另一个迭代器中的相应位置了.
18.c.assign(b,e)中的[b,e)依然是左闭合区间.
--------------------------------------------------
习题9.25
这一题,我发现《习题解答》这本书的答案不准确.经过测试,我觉得应该是这样,对于erase(elem1,elem2)函数:
1.当elem1不是指向末端的下一个位置时,只要elem2不在elem1的前面,就不会报错的.也就是elem2-elem1>=0就ok了.(当然他们要指向同一个容器).
2.当elem1指向末端的下一个位置时,只有elem2也指向这个容器末端的下一个位置时,才不会报错.
--------------------------------------------------
容器的选用
1.vector的优势在于可以随机访问元素,缺陷在于往容器开头或者中间插入(删除)元素时代价比较大.
2.list的优势在于插入(删除)元素的代价比较小,但是想随机访问元素花费的代价就比较大了.
3.deque的优势在于可以随机访问元素,而且在容器开头或者结尾处插入(删除)元素都不费力.但是往容器开头或者中间插入(删除)元素时代价依然比较大.
--------------------------------------------------
容器适配器
1.标准库提供了三种顺序容器适配器:queue,priority_queue和stack
2.就只说一下stack(栈),s.pop()删除栈顶元素不返回其值;s.top()返回栈顶元素,不删除该元素;s.push()在栈顶压入新元素;s.empty()判断栈是否为空;s.size()返回栈中元素的个数.