STL 学习笔记2

来源:互联网 发布:外星人源码 编辑:程序博客网 时间:2024/05/21 22:54

关于STL的几个问题。

首先, 在使用STL的时候, 程序中必须包含相关的头文件。

首先, 介绍vector的几个常见的问题。

Q: 存取vector的元素有两种办法, 即: 成员函数at() 和[], 二者有什么区别?

A: 使用[]去存取向量的元素的时候, 不会做range Check, 也就是说如果我们访问越界了, 全然不知。 而at() 函数在访问vector元素发生越界的时候, 会抛出异常错误。

 

Q:vector 和数组的相同之处

A: 都可以随机存取。

Q:对于vector的访问其中元素的方式有几种?

(1)通过下标, 例如vec[i]

(2)通过迭代器, *itr,这种方式比上面的random access更加的高效, 通常采用这种访问的办法。

(3)使用成员函数 vec.at(i)

 

Q:对于一个容器, 有没有一个通用的办法去访问容器中的元素?

A: 有, 例如:

就是一个访问容器通用的办法, 如果我们将vector 改为list, 同样适用:

 

 

尽管容器类有很。 但是这所有的容器却有些相同的接口。 如下:

 

例如, 我们将上面的vector 改为list, 同样是valid的。

 

对于向量, 有如下性质:

 

 

对于deque, 有如下性质:deque也想vector一样支持random access。

 

 

下面说说list.。 一个list 就是一个doubly linked list:

list 的相关特点如下:

注意insert(itr, 8)的意思是将8插入到itr的前面(此时itr指向的是2). 对于list而言, 无法随机存取。 list 相比于deque和lvector优点是插入和删除操作只需要花费常数的时间。 远远快于向量和双向对列。  list 的缺点是搜索太慢O(n)。 事实上远远比向量的搜索要慢的多。   不连续的内存, catch(缓存)比较慢。 而且list比向量占用的内存大。

 

 

尽管list优缺点。 但是list又有一杀手锏函数。 没有哪一个容器能够在这方面比得上list。 这就是函数splice。

上述的意思是, 对于一个myList2, 迭代器itr_a 和itr_b 定义了一个myList2中元素的range。  通过使用函数splice, 我们cut my data from myList2,  insert it at myList1, at the position of itr(插入的位置)。 无论我们的这个切片的data 有多huge。 这个操作只需要花费常数时间。

 

 

接下来看看每个节点只有一个指向下一个元素的前向链表:

 

对于一般的array, 有两个限制:

(1)大小不能改变。

(2) 2个整数的数组容器可能是不同的容器, 例如:

 

 

0 0
原创粉丝点击