【C/C++】顺序容器list和vector
顺序容器是拥有单一类型元素组成的一个有序集合。主要的顺序容器有vector和list。其实还有deque(双端队列)
1.vector数据结构
使用头文件:#include <vector>
vector和数组类似,拥有一段连续的内存空间,并且起始地址不变。
因此能高效的进行随机存取,时间复杂度为o(1);
但因为内存空间是连续的,所以在进行插入和删除操作时,会造成内存块的拷贝,时间复杂度为o(n)。
另外,当数组中内存空间不够时,会重新申请一块内存空间并进行内存拷贝。
使用vector需要注意以下几点:
①如果你要表示的向量长度较长(需要为向量内部保存很多数),容易导致内存泄漏,而且效率会很低;
②Vector作为函数的参数或者返回值时,需要注意它的写法:
double Distance(vector<int>&a, vector<int>&b) 其中的“&”绝对不能少!!!
2.list数据结构
使用头文件:#include <list>
list是由双向链表实现的,因此内存空间是不连续的。
只能通过指针访问数据,所以list的随机存取非常没有效率,时间复杂度为o(n);
但由于链表的特点,能高效地进行插入和删除。
总之,如果需要高效的随机存取,而不在乎插入和删除的效率,使用vector;
如果需要大量的插入和删除,而不关心随机存取,则应使用list。
3.vector基本操作
(1)头文件:#include<vector>
(2)建立一个vector:vector<int> vec;
(3)在尾部插入元素:
vec.push_back(1);
vec.push_back(2); //把1和2压入vector,这样vec[0]就是1,vec[1]就是2
(4)插入元素:vec.insert(vec.begin()+i,a); //在第i+1个元素前面插入a;
(5)删除元素:
vec.erase(vec.begin()+2); //删除第3个元素
vec.erase(vec.begin()+i,vec.end()+j); //删除区间[i,j-1];区间从0开始
(6)向量大小:vec.size();
(7)清空:vec.clear();
(8)使用迭代器访问元素:
vector<int>::iterator it;
for(it=vec.begin();it!=vec.end();it++)
cout<<*it<<endl;
(9)定义一个二维数组:
vector<vector<Point2f> > points;
points[0].size(); //指第一行的列数
4.vector如何自己增长?
容器的容量和长度:只有连续存储的容器才有容量的概念,例如vector,deque或string。list不要求容量。
为了提高效率 实际上 vector 并不是随每一个元素的插入而增长自己 而是当 vector 需要增长自身时 它实际分配的空间比当前所需的空间要多一些 也就是说 它分配了一些额外的内存容量 或者说它预留了这些存储区。
可以调用capacity()来查看当前容器的容量,调用size()来查看当前容器拥有元素的个数。
#include <vector>
#include <iostream>
using namespace std;
int main()
{vector< int > ivec;cout << "ivec: size: " << ivec.size()<< " capacity: " << ivec.capacity() << endl;for ( int ix = 0; ix < 24; ++ix ){ivec.push_back( ix );cout << "ivec: size: " << ivec.size()<< " capacity: " << ivec.capacity() << endl;}return 0;
}
可以看到,在ivec定义之后,长度和容量都是0。但是在插入元素之后,它的容量随每次重分配而加倍。
【C/C++】顺序容器list和vector相关推荐
- C++primer第九章 顺序容器 9.4 vector对象是如何增长的
为了支持快速随机访问,vector将元素连续存储,每个元素紧挨着前一个元素存储.通常情况下,我们不必关心一个标准库类型是如何实现的,而只需关心它如何使用.然而,对于vector和string,其部分实 ...
- C++ Primer 第九章 顺序容器
由于书籍上写的已经很经典了,故大部分用图片的形式来阐述概念,代码纯手打进行验证. 1.顺序容器类型:vector.deque.list.forword_list.array.string. 2.顺序容 ...
- C++ Primer 第9章 顺序容器 第一次学习笔记
1. 顺序容器概述 #include <vector> //可变大小数组.支持快速随机访问.在尾部之外的位置插入或删除元素可能很慢 #include <deque> //双端队 ...
- 【小白学习C++ 教程】二十一、C++ 中的STL容器Arrays和vector
@Author:Runsen C++的标准模板库(STL)是提供数组.向量.队列等数据结构的模板类的集合.STL是由容器.算法.迭代器组成的库. 容器 容器存储对象和数据.它们基本上是基于模板的泛型类 ...
- C++拾遗(四)——顺序容器
之前一篇博文(<初窥标准库>)简单了解了一种最常用的顺序容器:vector类型.本文将对该文内容进行进一步的学习和完善,继续讨论标准库提供的顺序容器类型.所谓顺序容器,即将单一类型的元素聚 ...
- 《C++Primer》第九章-顺序容器-学习笔记(1)-顺序容器定义与操作
<C++Primer>第九章-顺序容器-学习笔记(1) 文章目录 <C++Primer>第九章-顺序容器-学习笔记(1) 摘要 顺序容器的定义 容器元素的初始化 将一个容器初始 ...
- c++语法9 顺序容器
文章目录 顺序容器的类型 顺序容器适配器 1 顺序容器的定义 1.1容器元素的初始化 1.2容器内元素的类型约束 2 迭代器 3 顺序容器的操作 3.1 容器定义的类型别名 3.2 begin和end ...
- C++ Primer(顺序容器 上)
第九章 顺序容器 标准库定义了三种顺序容器类型:vector.list 和 deque. 标准库还提供了三种容器适配器(adaptors): stack, queue, priority_queue ...
- C++知识点17——使用C++标准库(顺序容器vector常用操作)
C++STL中的容器类型分为两种,一种是顺序容器,另一种是关联容器,这两种容器之所以被划分,本质区别是顺序容器可以通过元素在容器中的位置进行访问及存储,而关联容器只能通过键来访问和存储元素 顺序容器常 ...
最新文章
- ES6中的class是如何实现的?(附Babel编译的ES5代码详解)
- 每日一皮:当你要下班的时候,突然测试叫住了你...
- WebSphere MQ 自动启动发送方通道
- fft 相位谱_FFT和示波器实用指南——深圳零式未来仪器科技
- SAP License:杂谈-珍爱生命,远离SAP
- 你值得拥有的 11 个前端开发利器
- iOS企业证书申请介绍
- C语言实现大数计算器
- 计算机网络原理思维导图
- vcs+verdi/Debussy
- 微信小程序学习第8天——自定义组件的数据监听器Observer小案例
- 学java开发需要什么配置的电脑?
- 什么是WMS系统,有什么功能?
- python dataframe根据多列排名并生成序号_将rank字段添加到pandas dataframe,按唯一组和多列排序...
- 算法设计之动态规划法
- 手把手教你美国亚马逊直购
- 使用Lambda(拉姆达)对集合进行排序,一行代码即可解决
- 7种方法实现数组去重
- 使用OpenMP reduction子句求解二维数组的最小值和输出所在下标
- JDBC getParameterType call failed - using fallback method instead