STL之序列容器vector
首先来看看vector的模板声明:
template <class T, class Alloc = allocator<T>> class vector { //… };
vector接受2个模板参数,其中分配器属于默认参数,当然如果你想使用其他分配器话,得把2个参数都写出来,一般只需写入元素类型即可进行vector模板的实例化,如:
vector<int> vec;
vector属于序列式容器。所谓序列式容器,其中的元素都可序,但未必有序。vector与array其实挺像的, 唯一的区别就是array是静态空间,一旦配置了就不能改变。而vector呢,如果分配的空间不足,将会重新配置一块新空间,大小是原空间的2倍,然后将元素一一搬过来,最后释放旧空间。因此,vector比array更灵活。示意图如下:
(图片来自侯捷老师课程《STL与泛型编程》, 侵删)
(重新分配新空间 ,元素转移,释放旧内存)
顺便提一下vector的迭代器:vector的迭代器其实就是普通指针,由于vector具有连续的地址空间,所以它的迭代器类型支持Random Access iterators,随机存取,可跳跃。由于它的迭代器特性,使得vector中元素如果要实现某些算法时效率极高,如二分搜索系列算法。
vector常用的元素操作:push_back, pop_back, erase, insert, clear等。我们主要谈谈erase.
erase算法有两个版本:
iterator erase(iterator first, iterator last); // 清除[first, last)中的所有元素 iterator erase(iterator position); // 清除某个位置上的元素
附一段测试代码(版本为Dev C++5.11):
#include <iostream> #include <vector> #include <algorithm> using namespace std; int main() { int i; vector<, ); cout << "size = " << iv.size() << endl; // size = 2 cout << "capacity = " << iv.capacity() << endl; // capacity = 2 iv.push_back(); cout << "size = " << iv.size() << endl; // size = 3 cout << "capacity = " << iv.capacity() << endl; // capacity = 4 iv.push_back(); cout << "size = " << iv.size() << endl; // size = 4 cout << "capacity = " << iv.capacity() << endl; // capacity = 4 iv.push_back(); cout << "size = " << iv.size() << endl; // size = 5 cout << "capacity = " << iv.capacity() << endl; // capacity = 8 iv.push_back(); cout << "size = " << iv.size() << endl; // size = 6 cout << "capacity = " << iv.capacity() << endl; // capacity = 8 ; i < iv.size(); i++) { // 9 9 1 2 3 4 cout << iv[i] << ' '; } cout << endl; iv.push_back(); cout << "size = " << iv.size() << endl; // size = 7 cout << "capacity = " << iv.capacity() << endl; // capacity = 8 ; i < iv.size(); i++) { // 9 9 1 2 3 4 5 cout << iv[i] << ' '; } cout << endl; vector<); if (ivite != iv.end()){ iv.erase(ivite); } cout << "size = " << iv.size() << endl; // size = 6 cout << "capacity = " << iv.capacity() << endl; // capacity = 8 ; i < iv.size(); i++) { // 9 1 2 3 4 5 cout << iv[i] << ' '; } cout << endl; ivite = find(iv.begin(), iv.end(), ); if (ivite != iv.end()){ iv.insert(ivite, 1, ); // insert算法内部实现比较复杂(不做详谈)如:当备用空间不足,配置新内存的长度 } // 旧长度的2倍,或是旧长度+新增元素个数 cout << "size = " << iv.size() << endl; // size = 7 cout << "capacity = " << iv.capacity() << endl; // capacity = 8 ; i < iv.size(); i++) { cout << iv[i] << ' '; // 9 1 7 2 3 4 5 } cout << endl; iv.clear(); cout << "size = " << iv.size() << endl; // size = 0 cout << "capacity = " << iv.capacity() << endl; // capacitu = 8 return 0; }
STL之序列容器vector的更多相关文章
- C++线性序列容器<vector>简单总结
C++线性序列容器<vector>简单总结 vector是一个长度可变的数组,使用的时候无须声明上限,随着元素的增加,Vector的长度会自动增加:Vector类提供额外的方法来增加.删除 ...
- STL常用序列容器
这里简要的记述一下STL常用容器的实现原理,要点等内容. vector vector是比较常用的stl容器,用法与数组是非类似,其内部实现是连续空间分配,与数组的不同之处在于可弹性增加空间,而arra ...
- STL标准库-容器-vector
技术在于交流.沟通,本文为博主原创文章转载请注明出处并保持作品的完整性. 向量容器vector是一个动态数组,内存连续,它是动态分配内存,且每次扩张的原来的二倍. 他的结构如下 一 定义 vector ...
- STL之序列容器deque
首先看看deque的模板声明: template <class T, class Alloc = allocator<T>> // 原本还有个参数BufSize,现在新版本 ...
- C++STL(二)——vector容器
STL--vector容器 vector对象的概念 vector基本操作 vector对象的初始化.赋值 vector查找.替换(已在上一片 string类 博客总结过了,不再总结) vector添加 ...
- C++中防止STL中迭代器失效——map/set等关联容器——vector/list/deque等序列容器—如何防止迭代器失效—即erase()的使用
序列性容器::(vector和list和deque) erase迭代器不仅使所有指向被删元素的迭代器失效,而且使被 删元素之后的所有迭代器失效,所以不能使用erase(iter++)的方 式, ...
- C++进阶 STL(1) 第一天 [容器,算法,迭代器] string容器 vector容器 deque容器
课程大纲 02实现基本原理 容器,算法,迭代器 教室:容器 人:元素 教室对于楼:容器 序列式容器: 容器元素在容器中的位置是由进入容器的时间和地点来决定 序列式容器 关联式容器: 教室中 按年龄排座 ...
- 《STL源码剖析》——第四章、序列容器
1.容器的概观与分类 所谓序列式容器,其中的元素都可序(ordered)[比如可以使用sort进行排序],但未必有序(sorted).C++语言本身提供了一个序列式容器array,STL另外再提供v ...
- 标准模板库(STL)学习探究之vector容器
标准模板库(STL)学习探究之vector容器 C++ Vectors vector是C++标准模板库中的部分内容,它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库.vector之所以被 ...
随机推荐
- 安装dubbo-admin遇到的问题和解决之道
这里不多说dubbo的相关知识.简单提示dubbo-admin所需的环境.java的jdk和jre,dubbo-admin.war,tomcat. 今天只是把在win7环境下安装了dubbo-admi ...
- EL表达式有无双引号的区别
最近做项目时发现原来对EL表达式理解太浅,通过一个springMVC项目,加深了对其的理解,下面总结一下,如发现有不对之处,请批评指正: 1.在单独的js文件中,EL表达式无效,如:var type= ...
- VS调试技巧,提高调试效率(转):
如果你还没有使用过这些技巧,希望这篇博文能帮你发现它们. 它们学起来很容易,能帮你节省很多时间. 运行到光标(Ctrl+ F10) 我经常看见人们是这样来调试应用程序的: 他们在应用程序需要调试的代码 ...
- etcd第一集
网站:https://github.com/coreos/etcd 一些观点:https://yq.aliyun.com/articles/11035 1.etcd是键值存储仓库,配置共享和服务发现2 ...
- mongoDB之Pipeline Aggregation Stages
原文链接:https://docs.mongodb.com/manual/reference/operator/aggregation-pipeline/ 管道聚合 $project Reshapes ...
- ZIP4J---ZIP文件压缩与解压缩学习
package com.wbh.common.utils; import java.io.File; import java.io.FileInputStream; import java.io.IO ...
- CentOS MySQL 配置
问题: MySQL安装后root用户无法连接,提示 ERROR 1045 (28000): Access denied for user ’root’@’localhost’ (using passw ...
- SQL:安装多个实例,修改实例端口号,和IP加端口号连接实例
sql server 安装第一个实例,默认实例的端口是1433, 一个库中如果有多个实例,从第二个实例开始的端口是动态端口,需要的话,自己手工指定为静态端口,如指定第二个实例为1434 或着随意一个如 ...
- LVM在线扩容
我虚拟机根分区已经使用了35%,现在需要对他进行在线扩容,扩容之后使用率降到30% [root@localhost ~]# dfFilesystem 1K-blocks Used Available ...
- Python Q&A
http://ilian.i-n-i.org/python-interview-question-and-answers/ http://www.geekinterview.com/Interview ...