C++STL容器vector
vector简介
vector模塑出一个dynamic array,即动态数组。它本身是一个 “将元素置于dynamic array加以管理的抽象概念”,属于序列式容器。
使用条件:
包含头文件
#include<vector>
在此头文件中,类型vector是一个定义与namespace std 内的template:
namespace std {template <typename T,typename Allocator =allocator<T> >class vector; }
vector的元素可以是任意类型T,可有可无的第二个template参数用来定义内存模型。默认的内存模型是C++标准库提供的allocator(分配器)。
vector性能
1.vector是序列式容器,内部的元素之间存在一种顺序,即有序集合(ordered collection)。
2.vector支持随机访问,提供随机访问迭代器,所以使用与任何STL算法。值得注意的是,vector的高效率体现在末端附加或删除元素,若你在靠近前端的地方安插和删除元素,效率就会变得低下,这是因为作用点后的每一个元素都必须移动到另一个位置,而每一次移动都需要调用assignment操作符。
3.vector的大小与容量
vector采用动态内存分配,一旦超过其当前能够容纳的元素量,vector就会重新分配内部内存。
重新分配内存后:相关reference,pointer,iterator都会失效。并且重新分配内存很耗时间。所以在构建vector时,初始化期间就向构造函数传递额外实参来构建足够的空间是一个很好的选择。
vector具体操作
1.构建,复制与销毁操作
vector<elem> c //default构造函数,产生一个控的vector,无元素 vector<elem> c(c2) //copy构造函数,建立c2的同型并成为c2的一份拷贝 vector<elem> c=c2 //copy构造函数,建立一个新的vector作为c2的拷贝 vector<elem> c(n) //利用元素的default构造函数生成一个大小为n的vector vector<elem> c(n,x) //建立一个大小为n的vector,每个元素值都是x vector<elem> c(beg,end) //建立一个vector,以区间[beg,end)作为元素初值 c.~vector //销毁所有元素,释放内存
2.非更易型操作
c.empty() //返回容器是否为控 c.size() //返回目前的元素个数 c.max_size() //返回元素个数最大可能量 c.capacity() //返回不进行空间重新分配的情况下元素最大容量 c.reserve(num) //扩大容量 c.shrink_to_fit() //要求降低容量,以符合元素个数(保持优化)
值得注意的是,reserve和shrink_to_fit严格上并不是非更易的,它们会使reference,pointer,iterator失效,只是逻辑上vector并没有发生变化。
赋值操作
c=c2 //将c2的全部元素赋值给c c.assign(n,elem) //复制n个elem,赋值给c c.assign(beg,end) //将区间[beg,end)的元素赋值给c c.swap(c2) swap(c,c2) //都是置换c与c2的数据
3.元素访问操作
欲访问vector所有元素,你必须使用rbf循环,特定的操作函数或迭代器。按索引操作时其操作与数组操作原则类似,即下标从0开始,末尾size()-1。
c.[id] //返回索引id所指向的元素(不检查范围) c.at(id) //返回索引id所指向的元素(超出范围就抛出out_of_range异常 c.front() //返回第一元素(不检查是否存在) c.back() //返回最末元素(不检查是否存在)
4.迭代器相关函数
vector提供的是一个random-access iterator,即随机访问迭代器。
我们仅列出常用的操作函数
c.begin() //返回一个迭代器指向第一元素 c.end() //返回一个迭代器指向最末元素的下一位置 c.rbegin() //返回一个反向迭代器指向反向迭代的第一元素 c.rend() //返回一个反向迭代器指向反向迭代的最末元素的下一位置 c.push_back(elem) //附加一个elem的拷贝于末尾 c.pop_back() //移除最后一个元素,但是不返回 c.insert(pos,elem) //在iterator位置pos之前方插入一个elem拷贝,并返回新元素的位置 c.insert(pos,n,elem) //在ierator位置pos之前方插入n个elem拷贝,并返回第一个新元素的位置,若没有元素,则返回pos c.insert(pos,beg,end) //在ierator位置pos之前方插入区间[beg,end)内所有元素的拷贝,并返回第一个新元素的位置,若没有元素,则返回pos c.erase(pos) //移除iterator位置pos上的元素,返回下一个元素的位置 c.erase(beg,end) //移除区间[beg,end)内的所有元素,返回下一个元素的位置 c.resize(num) //将元素数量改为num,如果size()变大,多出的新元素都要以default函数初始化 c.resize(num,elem) //将元素数量改为num,如果size()变大,多出新元素都是elem的拷贝 c.clear() //移除所有元素,清空容器
5.直接移除与某值相等的所有元素
vector并没有提供任何函数来实行该操作,在这里我们可以使用算法
vector<elem> c; c.erase(remove(c.begin(),c.end(),val),c.end());
来删除所有值为val的元素
此外,vector还针对class vector<bool>实现了一个特殊优化版本,旨在同样数量元素下,耗用更小的空间,但同时效能可能会减低,不符合速度优先的宗旨,在此就不做赘述。
转载于:https://www.cnblogs.com/cloudplankroader/p/10429943.html
C++STL容器vector相关推荐
- c++ stl容器vector删除(erase),遍历等基本用法介绍及头文件
Vectors 包含着一系列连续存储的元素,其行为和数组类似.访问Vector中的任意元素或从末尾添加元素都可以在常量级时间复杂度内完成,而查找特定值的元素所处的位置或是在Vector中插入元素则是线 ...
- vector 清空 Linux,STL容器vector基础用法小结
STL容器vector基础用法小结根据<ACM程序设计>写的,用实例展示vector用法. 方法:push_back(), insert(), erase(), clear(), size ...
- oracle erase,c++ stl容器vector删除(erase),遍历等基本用法介绍及头文件
Vectors 包含着一系列连续存储的元素,其行为和数组类似.访问Vector中的任意元素或从末尾添加元素都可以在常量级时间复杂度内完成,而查找特定值的元素所处的位置或是在Vector中插入元素则是线 ...
- C++ STL: 容器vector源码分析
文章目录 前言 vector的核心接口 vector push_back实现 vector 的 Allocator vector 的 push_back 总结 前言 vector 是我们C++STL中 ...
- C++ STL容器vector篇(一) vector容器存放内置和自定义数据类型并遍历
写在前面 存放内置数据类型 代码 存放自定义数据类型 代码 总结 写在前面 本文算是B站黑马C++课程STL-vector部分的一个总结, 包含自己的一些想法(都在代码里了). 存放内置数据类型 以i ...
- C++ STL 容器 vector
1 vector简介 顺序存储, 初始化过程会分配一定量空间, 在尾部插入会很快, 但是在中间插入元素, 会把之后所有元素向后平移, 所以较慢(中间删除元素同理). 如果元素个数超过当前限制, 会重新 ...
- C++ STL容器vector篇(五) vector容器常用初始化操作总结(一维/二维)
`vector`初始化方法 一维向量 二维向量 参考 vector初始化方法 一维向量 #include <iostream> #include <vector>using n ...
- C++ STL容器vector篇(三) vector容器大小和数组大小, 插入和删除元素, 存储和读取元素
vector容器的大小(capacity)和存放数据的大小(size) #include <iostream> #include <vector>using namespace ...
- C++ STL容器vector篇(二) vector容器的构造函数与赋值操作
构造函数 构造函数的调用有四种方式: 默认构造函数(无参构造); 左闭右开区间元素拷贝给容器本身; 构造函数将n个elem拷贝给容器本身; 拷贝构造函数 代码如下: #include <iost ...
最新文章
- c语言大项目经验,C语言该学的地方(项目经验)
- 各大网站屏蔽搜索引擎抓取分析
- OpenCV——RGB三通道分离
- 一些数据结构的思想(3)
- 华为服务器显示红色的心跳,服务器心跳检查
- Java泛型三:通配符详解extends super
- TF之DD:利用Inception模型+GD算法生成带背景的大尺寸、高质量的Deep Dream图片
- LINQ中ForEach方法的使用
- 延时消息_手把手实现一条延时消息
- Educational Codeforces Round 41(已补D,E)
- 用户sa 登陆失败 SQLServer 错误18456----解决方法
- C++控制向文件中写入浮点数的格式
- 深入浅出不可思议的中文分词技术
- Kafka与RocketMQ的对比分析
- 一文详解 Serverless 技术选型
- JS获取鼠标的坐标和滚动条的位置
- 双系统bios如何设置默认启动系统_BIOS(主板)常用功能:设置启动磁盘顺序,迁移系统必备...
- MindMaster如何恢复未保存的内容
- ReactNative学习路线
- C语言定义数组起始地址对齐方式(IAR C99 Kinetis K66)
热门文章
- zz[as3 hack技术]垃圾回收机强制执行
- SQL Server 存储过程的分页
- python与人工智能编程-Python是人工智能和机器学习的最佳编程语言,证据在此!...
- 有道python网课怎么样-如何用python“优雅的”调用有道翻译?
- python自学入门教程-Python学习教程(一)自学资源分享
- python编写程序的一般步骤-Python编写win程序的操作流程
- python使用lxml及request爬取-python用lxml解析网页为什么不完整?
- python语言是谁发明的咋读-Python简史
- python装饰器原理-Python装饰器原理与用法分析
- python php区别-JAVA、PHP、Python这3种编程语言有什么区别?