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 }

原文地址:https://www.cnblogs.com/wangxiaoyong/p/8645150.html

时间: 2024-10-10 18:11:44

STL中 vector 和 list 一些特性的相关文章

C++的STL中vector内存分配方法的简单探索

STL中vector什么时候会自动分配内存,又是怎么分配的呢? 环境:Linux  CentOS 5.2 1.代码 #include <vector> #include <stdio.h> using namespace std; int main() { vector<int> x_vec; printf("data size : [%3d], mem size : [%3d]\n", x_vec.size(), x_vec.capacity())

C++ STL中vector(向量容器)使用简单介绍

原文:http://www.seacha.com/article.php/knowledge/cbase/2013/0903/2205.html C++ vector(向量容器)是一个线性顺序结构.相当于数组,但其大小可以不预先指定,并且自动扩展.它可以像数组一样被操作,由于它的特性我们完全可以将vector 看作动态数组,或者作为动态内存. 在创建一个vector 后,它会自动在内存中分配一块连续的内存空间进行数据存储,初始的空间大小可以预先指定也可以由vector 默认指定,这个大小即cap

STL中vector的初始化

vector可用于代替C++中的数组,一般一致认为应该多用vector,因为它的效率更高,而且具备很好的异常安全性.而且vector是STL推荐使用的默认容器,STL中向量是使用数组实现的,因此向量具有顺序表的特点,可以快速随机存取数据.向量是一种数据类型的对象的集合,每个对象根据其位置有一个整数索引值与其对应,类似于数组. 使用向量之前,必须包含相应的头文件: #include<vector> using std::vector 同时也应当注意,vector是一个模板类,而非数据类型.所以在

C++/STL中 vector中对 “=”赋值运算符的支持

由于好奇STL中的vector 对于自定义数据类型的 " = "(赋值运算符的)支持,谢了一段简单的测试代码进行测试. 结果证明vector对于赋值预算符支持良好,但是对于动态分配的类构成的vector数组, 博主认为一定要重写析构函数与复制构造函数以及运算符重载"="运算符(这是一条软件规则,详见博主测试),链接如下: http://blog.csdn.net/u010003835/article/details/47314811 测试代码: #include &

[转]STL中vector转数组(实际是数组的指针)

感谢:http://topic.csdn.net/t/20050429/20/3976956.html 感谢:http://yzyanchao.blogbus.com/logs/47796444.html 不过那边是转载自<effective stl>. std::vector很方便,但有时调用的函数的参数规定是数组,需要将vector转为数组,另外开辟一个空间,将vector一项项复制过去代价过大,可用下面的方法. 给定一个 vector<int>   v;         表达

C/C++知识要点2——STL中Vector、Map、Set容器的实现原理

1.Vector是顺序容器,是一个动态数组,支持随机存取.插入.删除.查找等操作,在内存中是一块连续的空间.在原有空间不够情况下自动分配空间,增加为原来的两倍.vector随机存取效率高,但是在vector插入元素,需要移动的数目多,效率低下. 注意:vector动态增加大小时,并不是在原空间之后持续新空间(因为无法保证原空间之后尚有可供配置的空间),而是以原大小的两倍另外配置一块较大的空间,然后将原内容拷贝过来,然后才开始在原内容之后构造新元素,并释放原空间.因此,对vector的任何操作,一

STL中vector的用法

vector应该是STL种最常用的容器了,可以当做数组来看待,只不过vector的元素更丰富,不仅仅是数据元素,还可以是结构体 1.vector的创建和初始化 vector <double> v;//创建一个double类型的vector vector <int> v2(5);//创建一个含有5个元素的int型vector,初始值默认为0 vector <int> v3(4,7);//创建一个含有4个元素的int型vector,初始值都为7 当然也可以通过在尾部添加元素

STL中vector,Map,Set的实现原理

vector的数据安排以及操作方式,与array非常类似,两者唯一的区别是空间运用的灵活性,array是静态空间,一旦配置了就不能改变,如果你想要大一点的空间,就必须首先配置一块新空间,然后将原来的元素一一复制进来,再把原来的空间释放给系统.但是vector是动态空间,随着元素的增加,它的内部机制会自行扩充空间以容纳新元素,因此vector的运用对于内存的合理利用与运用的灵活性有很大的帮助,我们再也不必因为害怕空间不足而一开始要求一个大块头的array了,我们可以安心使用vector,随便使用多

C++STL中vector容器 begin()与end()函数、front()与back()的用法

一.begin函数 函数原型: iterator begin(); const_iterator begin(); 功能: 返回一个当前vector容器中起始元素的迭代器.   二.end函数 函数原型: iterator end(); const_iterator end(); 功能: 返回一个当前vector容器中末尾元素的迭代器.   三.front函数 函数原型: reference front(); const_reference front(); 功能: 返回当前vector容器中起