STL vector,deque,list

一.vector
可变长的动态数组
必须包含头文件 #include <vector>
支持随机访问迭代器
• 根据下标随机访问某个元素时间为常数
• 在尾部添加速度很快
• 在中间插入慢
所有STL算法 都能对vector操作

构造函数初始化:
vector();无参构造函数, 将容器初始化成空的
vector(int n);将容器初始化成有n个元素
vector(int n, const T & val);假定元素类型是T, 将容器初始化成有n个元素, 每个元素的值都是val
vector(iterator first, iterator last); 将容器初始化为与别的容器上区间[first, last)一致的内容

成员函数:
void pop_back(); 删除容器末尾的元素
void push_back(const T & val); 将val添加到容器末尾
int size(); 返回容器中元素的个数
T & font(); 返回容器中第一个元素的引用
T & back(); 返回容器中最后一个元素的引用

 1 #include <iostream>
 2 #include <vector>
 3 using namespace std;
 4 int main() {
 5     int i;
 6     int a[5] = { 1,2,3,4,5 };
 7     vector<int> v(5);
 8     cout << v.end() - v.begin() << endl;
 9     for (i = 0; i < v.size(); i++) v[i] = i;
10     v.at(4) = 100;
11     for (i = 0; i < v.size(); i++)
12         cout << v[i] << ",";
13     cout << endl;
14     vector<int> v2(a, a + 5); //构造函数
15     v2.insert(v2.begin() + 2, 13); //在begin()+2位置插入13
16     for (i = 0; i < v2.size(); i++)
17         cout << v2.at(i) << ",";
18 }
19 //输出:
20 //5
21 //0, 1, 2, 3, 100,
22 //1, 2, 13, 3, 4, 5,

二维动态数组:
vector< vector<int> > v(3);
//v有3个元素,
//每个元素都是vector<int> 容器

 1 #include <iostream>
 2 #include <vector>
 3 using namespace std;
 4 int main() {
 5     vector<vector<int >> v(3);
 6     for (int i = 0; i<v.size(); ++i)
 7         for (int j = 0; j<4; ++j)
 8             v[i].push_back(j);
 9     for (int i = 0; i<v.size(); ++i) {
10         for (int j = 0; j<v[i].size(); ++j)
11             cout << v[i][j] << " ";
12         cout << endl;
13     }
14     return 0;
15 }
16 //输出:
17 //0 1 2 3
18 //0 1 2 3
19 //0 1 2 3

二.list

双向链表 #include <list>
在任何位置插入/删除都是常数时间
不支持根据下标随机存取元素
具有所有顺序容器都有的成员函数

还支持8个成员函数:
push_front 在链表最前面插入
pop_front 删除链表最前面的元素
sort 排序 (list 不支持 STL 的算法 sort)
remove 删除和指定值相等的所有元素
unique 删除所有和前一个元素相同的元素
merge 合并两个链表, 并清空被合并的链表
reverse 颠倒链表
splice 在指定位置前面插入另一链表中的一个或多个元素,并在另一链表中删除被插入的元素


list容器之sort函数
list容器的迭代器不支持完全随机访问,不能用标准库中sort函数对它进行排序
可以用list自己的sort成员函数
list<T> classname
classname.sort(compare); //compare函数可以自己定义
classname.sort(); //无参数版本, 按<排序
list容器只能使用双向迭代器
不支持大于/小于比较运算符, []运算符和随机移动(即类似 “list的迭代器+2” 的操作)

  1 #include <list>
  2 #include <iostream>
  3 #include <algorithm>
  4 using namespace std;
  5 class A { //定义类A, 并以友元重载<, ==和<<
  6 private:
  7     int n;
  8 public:
  9     A(int n_) { n = n_; }
 10     friend bool operator<(const A & a1, const A & a2);
 11     friend bool operator==(const A & a1, const A & a2);
 12     friend ostream & operator <<(ostream & o, const A & a);
 13 };
 14
 15 bool operator<(const A & a1, const A & a2) {
 16     return a1.n < a2.n;
 17 }
 18 bool operator==(const A & a1, const A & a2) {
 19     return a1.n == a2.n;
 20 }
 21 ostream & operator <<(ostream & o, const A & a) {
 22     o << a.n;
 23     return o;
 24 }
 25
 26 //定义函数模板PrintList, 打印列表中的对象
 27 template <class T>
 28 void PrintList(const list<T> & lst) {
 29     int tmp = lst.size();
 30     if (tmp > 0) {
 31         typename list<T>::const_iterator i;
 32         i = lst.begin();
 33         for (i = lst.begin(); i != lst.end(); i++)
 34             cout << *i << ",";
 35     }
 36 }
 37
 38 //与其他顺序容器不同, list容器只能使用双向迭代器,
 39 //因此不支持大于/小于比较运算符, []运算符和随机移动
 40 // typename用来说明 list<T>::const_iterator是个类型
 41 //在VS中不写也可以
 42
 43 int main() {
 44     list<A> lst1, lst2;
 45     lst1.push_back(1); lst1.push_back(3);
 46     lst1.push_back(2); lst1.push_back(4); lst1.push_back(2);
 47     lst2.push_back(10); lst2.push_front(20);
 48     lst2.push_back(30); lst2.push_back(30);
 49     lst2.push_back(30); lst2.push_front(40); lst2.push_back(40);
 50     cout << "1) "; PrintList(lst1); cout << endl;
 51     cout << "2) "; PrintList(lst2); cout << endl;
 52     lst2.sort(); //list容器的sort函数
 53     cout << "3) "; PrintList(lst2); cout << endl;
 54     //1) 1, 3, 2, 4, 2,
 55     //2) 40, 20, 10, 30, 30, 30, 40,
 56     //3) 10, 20, 30, 30, 30, 40, 40,
 57
 58     lst2.pop_front();
 59     cout << "4) "; PrintList(lst2); cout << endl;
 60     lst1.remove(2); //删除所有和A(2)相等的元素
 61     cout << "5) "; PrintList(lst1); cout << endl;
 62     lst2.unique(); //删除所有和前一个元素相等的元素
 63     cout << "6) "; PrintList(lst2); cout << endl;
 64     lst1.merge(lst2); //合并 lst2到lst1并清空lst2
 65     cout << "7) "; PrintList(lst1); cout << endl;
 66     cout << "8) "; PrintList(lst2); cout << endl;
 67     lst1.reverse();
 68     cout << "9) "; PrintList(lst1); cout << endl;
 69     /*4) 20, 30, 30, 30, 40, 40,
 70     5) 1, 3, 4,
 71     6) 20, 30, 40,
 72     7) 1, 3, 4, 20, 30, 40,
 73     8)
 74     9) 40, 30, 20, 4, 3, 1,*/
 75
 76     lst2.push_back(100); lst2.push_back(200);
 77     lst2.push_back(300); lst2.push_back(400);
 78     list<A>::iterator p1, p2, p3;
 79     p1 = find(lst1.begin(), lst1.end(), 3);
 80     p2 = find(lst2.begin(), lst2.end(), 200);
 81     p3 = find(lst2.begin(), lst2.end(), 400);
 82     lst1.splice(p1, lst2, p2, p3); //将[p2,p3)插入p1之前,
 83                                    //并从lst2中删除[p2, p3)
 84     cout << "11) "; PrintList(lst1); cout << endl;
 85     cout << "12) "; PrintList(lst2); cout << endl;
 86 }
 87 //11) 40, 30, 20, 4, 200, 300, 3, 1,
 88 //12) 100, 400,
 89 //输出:
 90 //1) 1, 3, 2, 4, 2,
 91 //2) 40, 20, 10, 30, 30, 30, 40,
 92 //3) 10, 20, 30, 30, 30, 40, 40,
 93 //4) 20, 30, 30, 30, 40, 40,
 94 //5) 1, 3, 4,
 95 //6) 20, 30, 40,
 96 //7) 1, 3, 4, 20, 30, 40,
 97 //8)
 98 //9) 40, 30, 20, 4, 3, 1,
 99 //11) 40, 30, 20, 4, 200, 300, 3, 1,
100 //12) 100, 400,


三.deque 容器
双向队列,必须包含头文件 #include <deque>
所有适用于vector的操作 都适用于deque
deque还有 push_front (将元素插入到容器的头部)和 pop_front (删除头部的元素) 操作

时间: 2024-10-05 04:19:34

STL vector,deque,list的相关文章

STL标准容器类学习笔记之(Vector/Deque/List)

STL标准容器类简介 1.顺序性容器 vector相当与数组,从后面快速的插入与删除,直接访问任何元素 deque双队列,从前面或后面快速的插入与删除,直接访问任何元素 list双链表,从任何地方快速插入与删除 2.关联容器 set快速查找,不允许重复值 multiset快速查找,允许重复值 map一对一映射,基于关键字快速查找,不允许重复值 multimap一对多映射,基于关键字快速查找,允许重复值 3.容器适配器 stack后进先出 queue先进先出 priority_queue最高优先级

stl 中List vector deque区别

stl提供了三个最基本的容器:vector,list,deque.         vector和built-in数组类似,它拥有一段连续的内存空间,并且起始地址不变,因此     它能非常好的支持随即存取,即[]操作符,但由于它的内存空间是连续的,所以在中间     进行插入和删除会造成内存块的拷贝,另外,当该数组后的内存空间不够时,需要重新     申请一块足够大的内存并进行内存的拷贝.这些都大大影响了vector的效率.         list就是数据结构中的双向链表(根据sgi   s

C++ STL vector容器学习

STL(Standard Template Library)标准模板库是C++最重要的组成部分,它提供了一组表示容器.迭代器.函数对象和算法的模板.其中容器是存储类型相同的数据的结构(如vector,list, deque, set, map等),算法完成特定任务,迭代器用来遍历容器对象,扮演容器和算法之间的胶合剂. 模板类vector 在计算中,矢量(vector)对应数组,它的数据安排以及操作方式,与array非常类似.在C++中,使用vector模板类时,需要头文件包含#include<v

STL ——vector 学习

STL简介 C++ STL (Standard Template Library标准模板库) 是通用类模板和算法的集合,它提供给程序员一些标准的数据结构的实现如 queues(队列), lists(链表), 和 stacks(栈)等.  C++ STL 提供给程序员以下三类数据结构的实现: 标准容器类   顺序性容器  vector 从后面快速的插入与删除,直接访问任何元素  deque 从前面或后面快速的插入与删除,直接访问任何元素 list 双链表,从任何地方快速插入与删除   关联容器  

带你深入理解STL之Deque容器

在介绍STL的deque的容器之前,我们先来总结一下vector和list的优缺点.vector在内存中是分配一段连续的内存空间进行存储,其迭代器采用原生指针即可,因此其支持随机访问和存储,支持下标操作符,节省空间.但是其在分配的内存不够的情况下,需要对容器整体进行重新分配.拷贝和释放等操作,而且在vector中间插入或删除元素效率很低. 而list是以节点形式来存放数据,使用的是非连续的内存空间来存放数据,因此,在其内部插入和删除元素的时间复杂度都是O(1),但是其不支持随机访问和存取,不支持

STL之deque容器的实现框架

说明:本文仅供学习交流,转载请标明出处,欢迎转载! vector底层采用的是一个数组来实现,list底层采用的是一个环形的双向链表实现,而deque则采用的是两者相结合,所谓结合,并不是两种数据结构的结合,而是某些性能上的结合.我们知道,vector支持随机访问,而list支持常量时间的删除,deque支持的是随机访问以及首尾元素的删除. deque是double ended queue的缩写,读作deck.首先我们用一个图来说明deque底层所采用的数据结构. 这个数据结构有一种似曾相识的感觉

利用内存chunk充当数据buffer的vector的实现,和STL vector 有接口操作性能比较

问题描述: 1.vector是最常用到的容器,它其实是一种自动扩充的动态数组,底层实现通过两倍扩展, 所以再不能预知要存入元素多少时,难免要两倍扩展,这带来了拷贝所存对象的开销: 2.本文尝试利用memory chunk作为底层存储容器来避免动态扩展时copy 开销: 3.本实现屏蔽了STL  vector 一些接口比如erase,主要是为了减轻实现复杂性考虑: 4.它支持两边插入和删除操作,其接口功能完全等同于STL 的deque: 5.和STL vector 做了push_back, pop

stl vector 类

目录 [-]说明构造方法例子vector 类中定义了4中种构造函数: · 默认构造函数,构造一个初始长度为0的空向量,如:vector<int> v1; · 带有单个整形参数的构造函数,此参数描述了向量的初始大小. 说明 vector是一种动态数组,是基本数组的类模板.其内部定义了很多基本操作. #include <vector> 注意:头文件没有“.h”构造: 这个构造函数还有一个可选的参数,这是一个类型为T的实例,描述了各个向量种各成员的初始值: 如:vector<int

STL学习——Deque篇

STL学习--Deque篇 deque概述 deque是一种双向开口的连续线性空间.双向开口指可以在头尾两端分别做元素的插入和删除操作.虽然vector也可以在头尾两端进行操作,但是其头部操作效率极差,无法被接受. deque与vector最大差异:1)deque允许于常数时间内对起头端进行元素的插入或移除操作:2)deque没有所谓的容量概念,因为它是动态地以分段连续空间组合而成,随时可以增加一段新的空间并连接起来.deque不提供所谓的空间保留功能,不存在重新配置,移动数据,释放原空间操作.