STL中 vector 和 list 一些特性

 

STL中的vector特点是: 其容量在需要时可以自动分配,本质上是数组形式的存储方式。即在索引可以在常数时间内完成。缺点是在插入或者删除一项时,需要线性时间。但是在尾部插入或者删除,是常数时间的。

 

STL的 list 是双向链表:如果知道位置,在其中进行插入和删除操作时,是常数时间的。索引则需要线性时间(和单链表一样)。

 

以下是vector和list中常用的方法:

 

int size() const  ;  返回容器内所有元素的个数。

void  clear()  ;    删除容器中所有元素。

bool  empty() ;    判断容器是否为空,如是,则返回true,否则返回false。

 

vector 和 list 都支持在常量的时间内在容器的末尾添加或者删除项,vector和list都支持在常量的时间内访问表的前端的项,操作如下:

 

void push_back( const Object & x)  ; 在容器的末尾添加x。

void pop_back() ; 删除容器的末尾对象。

const  Object & back() const ; 返回表的末尾的对象。

const Object & front() const ; 返回表的前端的对象。

 

list(双向链表) 中独有的方法,可以在容器的前端进行改变:

 void push_back(const Object & x) ; 在list的前端添加x。

 void pop_front() ;在list前端删除对象。

 

vector 中独有的高效索引方法:

Object & operator[ ] (int idx)  ,使用[ ]索引某个位置的元素,不包含边界检测。

Object & at (int idx) , 返回vector中idx索引位置的对象,包含边界检测。

int capacity( ) const ; 返回vector 内部的容量。

void reserve(int new Capacity): 设定vector的新容量,如果有对vector容量的良好估计,可以避免对vector扩展。

 

STL中的vector特点是: 其容量在需要时可以自动分配,本质上是数组形式的存储方式。即在索引可以在常数时间内完成。缺点是在插入或者删除一项时,需要线性时间。但是在尾部插入或者删除,是常数时间的。

 

STL的 list 是双向链表:如果知道位置,在其中进行插入和删除操作时,是常数时间的。索引则需要线性时间(和单链表一样)。

 

以下是vector和list中常用的方法:

 

int size() const  ;  返回容器内所有元素的个数。

void  clear()  ;    删除容器中所有元素。

bool  empty() ;    判断容器是否为空,如是,则返回true,否则返回false。

 

vector 和 list 都支持在常量的时间内在容器的末尾添加或者删除项,vector和list都支持在常量的时间内访问表的前端的项,操作如下:

 

void push_back( const Object & x)  ; 在容器的末尾添加x。

void pop_back() ; 删除容器的末尾对象。

const  Object & back() const ; 返回表的末尾的对象。

const Object & front() const ; 返回表的前端的对象。

 

list(双向链表) 中独有的方法,可以在容器的前端进行改变:

 void push_back(const Object & x) ; 在list的前端添加x。

 void pop_front() ;在list前端删除对象。

 

vector 中独有的高效索引方法:

Object & operator[ ] (int idx)  ,使用[ ]索引某个位置的元素,不包含边界检测。

Object & at (int idx) , 返回vector中idx索引位置的对象,包含边界检测。

int capacity( ) const ; 返回vector 内部的容量。

void reserve(int new Capacity): 设定vector的新容量,如果有对vector容量的良好估计,可以避免对vector扩展。

 

 1 #include <vector> 
 2 #include <list>
 3 #include <iostream>
 4 
 5 using namespace std;
 6 
 7 int main()
 8 {
 9     vector<int>  v1(10,22);     // 创建一个大小为 10的vector,初始化所有元素为 22 
10     list<int>  l1;
11     for(int i = 0; i < 10; i++)  // 创建并初始化一个list  
12     {
13         l1.push_back(i);
14     }
15     
16     // 打印 v1 和 l1 的大小 
17     cout<<"The size of v1: "<<v1.size()<<", "<<"the size of l1: "<<l1.size()<<endl;
18     
19     //打印出 v1 
20     
21     cout<<"v1: ";
22     for (int i = 0 ; i < v1.size(); i++)
23     {
24         cout<<v1[i]<<" ";
25     }
26     cout<<endl;
27     
28     // 打印出 l1 
29     cout<<"l1: ";
30     for (list<int>::iterator iter = l1.begin(); iter != l1.end(); iter++)
31     {
32         cout<<*iter<<" ";    
33     } 
34     cout<<endl;
35     
36     // 在 v1 末尾添加一项,在 l1 末尾 和头部 各添加一项
37     
38     v1.push_back(333);
39     l1.push_back(111);
40     l1.push_front(222);
41     
42     // 打印v1 
43     
44     cout<<"v1: ";
45     for (int i = 0 ; i < v1.size(); i++)
46     {
47         cout<<v1[i]<<" ";
48     }
49     cout<<endl;
50     
51     // 打印出 l1 
52     cout<<"l1: ";
53     for (list<int>::iterator iter = l1.begin(); iter != l1.end(); iter++)
54     {
55         cout<<*iter<<" ";    
56     } 
57     cout<<endl;
58      
59     // 使用 at 访问 v1 中的元素,如果超出下标范围,会报错。 
60     
61     cout<<"v1.at(10): "<<v1.at(10)<<endl; 
62     
63     // 返回v1 的capacity 
64     cout<<"v1.capacity(): "<<v1.capacity()<<endl; 
65     
66     // 使用 reserve 改变 v1 容量
67     v1.reserve(26);
68     cout<<"After reserve ,v1.capacity(): "<<v1.capacity()<<endl; 
69     return 0;
70 }

 

posted @ 2018-03-25 16:09  山里的小勇子  阅读(1936)  评论(0编辑  收藏  举报