C++vector类
系列文章目录
C++入门
C++类和对象(上)
C++类和对象(中)
C++类和对象(下)
C/C++内存管理
C++string类
文章目录
- 系列文章目录
- 一、vector是什么?
- 二、常用接口说明
- 1.常见的构造函数
- 2.vector iterator的使用
- 3.关于vector的容量
- 4.vector的增删改查
- 5.迭代器失效
一、vector是什么?
vector是表示可变大小数组的序列容器,类似于数组,vector也采用连续的存储空间来存储元素。这就意味之可以通过下标对vector中元素进行随机访问。同时,其大小是可以动态改变的,会被容器自动处理。
本质上讲,vector使用动态内存分配数组来存储它的元素。当新元素插入时,这个数组需要被重新分配大小。其做法是,分配一个新的数组,将全部元素移到这个数组。就时间而言,这是一个代价相对较高的任务。
vector会分配一些额外的空间以适应可能的增长,因为存储空间比实际需要的存储空间更大,但是获得了管理存储空间的能力。而对于不同的库则采用不同的策略权衡空间的使用和重新分配。
二、常用接口说明
1.常见的构造函数
constructor构造函数声明 | 接口说明 |
---|---|
vector | 无参构造 |
vector(size_t n, const value_type& val = value_type()) | 构造并初始化n个val |
vector(const vector& x) | 拷贝构造 |
vector InputIterator first, InputIterator last | 使用迭代器进行初始化构造 |
代码如下:
#include<iostream>
#include<vector>using namespace std;int main(){//调用无参构造函数vector<int> first;vector<int> second(4, 100);//用迭代器进行构造vector<int> third(second.begin(), second.end());//拷贝构造vector<int> fourth(third);return 0;
}
2.vector iterator的使用
iterator使用 | 接口说明 |
---|---|
begin + end | 获取第一个数据位置的iterator/const_iterator,获取最后一个数据的下一个位置的iterator/const_iterator |
rbegin + rend | 获取最后一个数据位置的reverse_iterator,获取第一个数据钱一个位置的iterator |
注意:begin获取的是第一个位置rbegin获取的是倒数第一个位置,而end获取的是最后一个位置的下一个位置,rend获取的是第一个位置的前一个位置。
代码如下:
int main()
{vector<int> v;v.push_back(1);v.push_back(2);v.push_back(3);v.push_back(4);//正向打印vector<int>::iterator it = v.begin();while (it != v.end()){cout << *it << ' ';cout << endl;++it;}cout << endl;//反向打印vector<int>::reverse_iterator rit = v.rbegin();while (rit != v.rend()){cout << *rit << " ";cout << endl;++rit;}return 0;
}
3.关于vector的容量
容量空间 | 接口说明 |
---|---|
size | 获取数据个数 |
capacity | 获取容量大小 |
empty | 判空 |
resize | 改变vector的size |
reserve | 改变vector的capacity |
reserve只负责开辟空间,如果确定知道需要多少空间reserve可以缓解vector增容的代价缺陷问题。
resize在开辟空间时还会进行初始化,影响size。
4.vector的增删改查
vector | 接口说明 |
---|---|
push_back | 尾插 |
pop_back | 尾删 |
find | 查找(算法) |
insert | 在指定位置之前插入数据 |
erase | 删除指定位置的数据 |
swap | 交换两个vector的数据空间 |
operator[] | 像数组一样随机访问 |
代码如下:
尾插四个数据并用迭代器打印:
int main()
{vector<int> v;v.push_back(1);v.push_back(2);v.push_back(3);v.push_back(4);vector<int>::iterator it = v.begin();while (it != v.end()){cout << *it << ' ';cout << endl;++it;}return 0;
}
尾删两个数据:
int main()
{vector<int> v;v.push_back(1);v.push_back(2);v.push_back(3);v.push_back(4);v.pop_back();v.pop_back();return 0;
}
在指定范围内查找相应数据,并进行插入和删除操作。
int main()
{//找到pos位置并插入数据vector<int>::iterator pos = find(v.begin(), v.end(), 3);v.insert(pos, 30);PrintVector(v);//删除pos位置数据pos = find(v.begin(), v.end(), 3);v.erase(pos);PrintVector(v);return 0;
}
5.迭代器失效
我们首先来看一段代码:
int main()
{//找到pos位置并插入数据vector<int>::iterator pos = find(v.begin(), v.end(), 3);v.insert(pos, 30);PrintVector(v);//删除pos位置数据pos = find(v.begin(), v.end(), 3);v.erase(pos);PrintVector(v);return 0;
}
这个还是上面的插入和删除操作,首先在指定范围内找到3这个整型元素,然后在这个位置插入30,删除也是先在指定范围内找到3这个整型元素,然后在这个位置删除。但是删除的时候我们又重新定义了一个迭代器,如果我们不定义呢?会发生什么?
int main()
{//找到pos位置并插入数据vector<int>::iterator pos = find(v.begin(), v.end(), 3);v.insert(pos, 30);PrintVector(v);//删除pos位置数据//pos = find(v.begin(), v.end(), 3);v.erase(pos);PrintVector(v);return 0;
}
在vs编译器上程序崩溃了,因为插入数据以后,迭代器的意义发生改变了,根据这个例子来分析,本来我们是让其指向3这个元素的位置,但是插入数据以后,迭代器指向的却是我们新插入的元素。这就是迭代器失效。
因为迭代器的主要作用就是让算法能够不关心底层数据,其实底层就是一个指针,或者说是对指针进行了封装。因此迭代器失效,实际就是迭代器底层对应指针所指向空间销毁了,而使用一块已被释放的内存,造成的后果是程序崩溃(如果继续使用已经失效的迭代器,程序可能就会崩溃)。
而下列操作可能会导致vector迭代器失效:
会引起其底层空间改变的操作,都有可能使迭代器失效,比如resize,reserve,insert,erase,push_back等。
而解决这个问题的办法很简单,只要在使用前对迭代器重新赋值即可。
C++vector类相关推荐
- C++ 笔记(23)— STL vector 类(实例化 vector、末尾插入、指定位置插入、数组方式访问元素、指针方式访问元素、删除元素、大小与容量区别)
1. vector 特点 vector 是一个模板类,提供了动态数组的通用功能,具有如下特点: 在数组末尾添加元素所需的时间是固定的,即在末尾插入元素的所需时间不随数组大小而异,在末尾删除元素也如此: ...
- 【stanford C++】容器III——Vector类
主要介绍如下5个容器类--Vector, Stack,Queue,Map和Set,各个都表示一重要的抽象数据类型.另外,各个类都是一些简单类型的值的集合,所以称它们为容器类. 暂且我们先不需要知道它们 ...
- java向量vector类,java数据结构——Vector(向量类)
Vector底层是用数组实现的,其容量是可以动态扩展的,默认初始容量是10,默认增长因子是0,详细的扩容方式会在构造方法中讲述. Vector对象和ArrayList一样可以随意插入不同类的对象,因为 ...
- 黑马程序员--打印流、序列输入流、Vector 类
--------- android培训.java培训.期待与您交流! --------- 1 打印流 打印流: 该流提供了打印方法,可以将各种数据类型的数据都原样打印. 字节打印流: PrintStr ...
- 利用std::allocator实现自定义的vector类
std::allocator即空间配置器,用于内存分配.更多的细节建议大家研究相关源码. 这里仅是利用std::allocator来实现简单的自定义vector类,如有问题欢迎指正. 1 #inclu ...
- C++ vector类详解
转自http://blog.csdn.net/whz_zb/article/details/6827999 vector简介 vector是STL中最常见的容器,它是一种顺序容器,支持随机访问.vec ...
- 【C++grammar】vector类和字符串字面量
C++的vector类 用数组存放数据时,容量大小不可变,vector对象容量可自动增大. vector的操作: 调用push_back函数时,vector对象的容量可能会增大. 观察下列操作对vec ...
- java的vector_java中的Vector类
public class Vector Vector 类实现了可动态扩充的对象数组.类似数组,它包含的元素可通过数组下标来访问.但是,在 Vector 创建之后.Vector 可根据增加和删除元素的需 ...
- java 课后习题 Vector类的 初使用
知识点: 1.Vector 类的使用 多类型数据的Vector类 2-addElement(obj); //添加元素 (int)Student.elementAt //把元素的值作为整型输出 Stud ...
- 【JAVA 第五章 】课后习题 Vector类的 初使用
知识点: 1.Vector 类的使用 多类型数据的Vector类 2-addElement(obj); //添加元素 3. (int)Student.elementAt //把元素的值作为整型输出 4 ...
最新文章
- Pycharm报错合集:在pycharm运行anaconda配置的Pytorch环境报错(Environment location diretory is not empty )
- cron表达式 每隔1个小时_2-1!1-1!短短51个小时,西班牙人获4大喜讯,天佑武磊...
- matlab怎么删除上一条命令_怎么恢复电脑上删除的图片?四大步搞定
- 设计时晶振的问题库(z)
- mysql设置表名字为占位符_这可能是把MySQL存储引擎讲解的最清楚的一篇文章了
- wegame地下城不显示服务器,在电脑端wegame看不到旭旭宝宝?来吧我教你! - 地下城与勇士掌游宝...
- Python面向对象编程案例:封装数据库增删改查操作
- linux tab的含义,理解Linux中crontab定时器里的 21 含义 - 金牛座, 爬山虎, PHPCreeper, Workerman, Swoole, PHP爬虫引擎, PHP爬...
- 腾讯云服务器CentOS 7安装Tomcat并部署JSP站点统计进入站点人数
- Untiy中的数据平滑处理
- 数据库——“该连接已关闭”问题解决方案
- autojs 文件转base64
- Flash倒计时+写在自定义类+写在关键帧
- Android--›键盘表情切换的终极解决方案(已重构)
- VMware 8安装Mac OS X 10.7
- css英文文本不换行,CSS样式表让英文文本自动换行
- JNI中创建新的线程回调java方法的技巧
- IFC中的轴网(IfcGrid)
- Android判断两个时间戳是否是一天
- 执行npm run dev 报错 vue-element-admin@4.2.1 dev: `vue-cli-service serve`
热门文章
- 从历史中讲创业的韧性
- rtrim() 函数
- Matlab练习1:正方形的对称性群的乘法表
- web day02 表格 表单及HTML常用的表单控件
- process.cwd()
- centos 修改 hostname方法总结
- 17092601_CentOS7(64)下Oracle11g设置开机自启动
- (转)Base64原理解析
- web.xml过滤html,Servlet过滤器两种配置方法(注解、配置web.xml文件)
- php取整函数保存两位小数,PHP取整函数的具体使用方法介绍