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 }