容器相关介绍

来源:互联网 发布:微信营销游戏源码 编辑:程序博客网 时间:2024/06/05 05:09

1、顺序容器

  vector 支持快速随机访问  ,代价:中间插入元素开销大 。

list 支持快速插入和删除 ,代价:随机访问开销大   。

deque 双端队列,从两端插入和删除数据都比较快。

2、容器构造函数

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

3、迭代器

迭代器是一种检查容器内元素并遍历元素的数据类型。每一种容器均有各自的迭代器类型,用于访问容器类的元素;
例如vector:
vector<int>::iterator iter;
每种容器都定义了一对命名为begin 和end 的函数, 用于返回迭代器。如果容器中有元素的话,由begin 返回的迭代器指向第一个元素:
vector< int>: : iterator iter = ivec .begin();
上述语句把iter 初始化为由名为begin 的vector 操作返回的值。假设vector 不空,初始化后, iter 即指该元素为ivec[0] 由end 操作返回的迭代器指向vector 的"末端元素的下一个",通常称为超出末端迭代器,表明它指向了一个不存在的元素。如果vector 为空, begin 返问的迭代器与end 返回的迭代器相同。
这是一个很典型使用vector的STL程式:
1 #include <vector>
2 #include <iostream>

4 using namespace std;

6 int main() {
7 vector<int> ivec;
8 ivec.push_back(1);
9 ivec.push_back(2);
10 ivec.push_back(3);
11 ivec.push_back(4);
12 
13for(vector<int>::iterator  iter = ivec.begin(); iter != ivec.end(); ++iter){
14cout << *iter << endl;
15 }

4、const_iterator

该类型只能用于读取容器内元素,但不能改变其值。当对const_iterator类型进行解引用时,返回的是一个const 值,故不能修改值。
注意:const_iterator 和 const 的iterator的区别:
vector<int>::const_iterator iter1 = vec.cbegin();
*iter = 3; //Error
++iter; //Ok
const vector<int>::iterator iter2 = vec.begin();
*iter = 4; //Ok
++iter; //Error const 迭代器几乎没有什么用处,因为不能让它指向其它元素,只能用它修改指向元素的值。

5、访问容器内元素的操作

c. back ()    返回容器c 的最后一个元素的引用。如果c 为空,则该操作未定义。
c. front ( )     返回容器c 的第一个元素的引用。如果c 为空,则该操作未定义。
c[n]      返回下标为n的元素的引用, 如果n<O 或n>=c .s ize() ,则该操作未定义 。 只适用于vector 和deque 容器。
c.at(n)   返回下标为n 的元素的引用。如果下标越界,则该操作未定义。只适用于vector 和deque 容器
list是链表存储,并不支持随机访问,所以无法通过下标的方式索引。


0 0
原创粉丝点击