C++STL之Vector向量详解,用法和例子 一起学习 一起加油
C++ STL之vector用法总结
- 1.vector是可变大小数组的序列容器
- 2.像数组一样,vector也采用连续储存空间来储存元素,就是说可以采用下标
- 对数组进行访问,大小可变,会被容器自动处理
- 3.本质讲,vector使用动态分配数组来存储它的元素。
- 当新元素插入时候,这个数组需要被重新分配大小为了增加存储空间。
- 其做法是,分配一个新的数组,然后将全部元素移到这个数组。就时间而言,
- 这是一个相对代价高的任务,因为每当一个新的元素加入到容器的时候,
- vector并不会每次都重新分配大小。
- 4.与其它动态序列容器相比(deques, lists and forward_lists),
- vector在访问元素的时候更加高效,在末尾添加和删除元素相对高效。
- 对于其它不在末尾的删除和插入操作,效率更低。
- 比起lists和forward_lists统一的迭代器和引用更好。
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
//vector的声明及初始化
1 vector<int> vec; //声明一个int型向量
2 vector<int> vec1(5); //声明一个初始大小为5的int向量
3 vector<int> vec2(10, 1); //声明一个初始大小为10且值都为1的向量
4 vector<int> vec3(vec1); //声明并用vec1向量初始化vec3向量
5 vector<int> tmp(vec2.begin(), vec2.begin() + 3); //用向量vec的第0个到第二个初始化tmp
6 int arr[5] = { 1,2,3,4,5 };
7 vector<int> vec4(arr, arr+5); //将arr数组的元素用于初始化vec向量
8 //说明::::不包括arr[4]元素,末尾指针都是指结束元素的下一个元素
9 //为了和vec.end()指针统一
10 vector<int> vec5(arr, &arr[4]);
//vector基本操作
//1.容量
/*
向量大小:vec.size()
向量最大容量:vec.max_size()
更改向量大小: vec.resize()
向量真实大小: vec.cappcity()
向量判空: vec.empty()
减少向量大小到满足元素所占储存空间的大小 : vec.shrink_to_fit();
*/
测试代码
1 void main() {
2 cout << vec4.size() << ends <<vec4.capacity() <<ends<<vec.max_size()<< endl;
3 cout << vec4.empty() << endl; //空为1,非空为0
4 cout << vec.empty() << endl;
5 vec.push_back(32);
6 for (int i = 0; i < 40; i++)
7 {
8 vec.push_back(i);
9 }
10 cout << vec.size() << ends << vec.capacity() << endl;
11 vec.shrink_to_fit();
12 cout << vec.capacity() << endl;
13 for(int i=0;i<vec4.size();i++)
14 cout << vec4[i] << endl;
15 for (int i = 0; i<vec5.size(); i++)
16 cout << vec5[i] << endl;
17 }
//2.修改
/*
多个元素赋值: vec.assign() //类似与初始化时用数组赋值
末尾添加元素:vec.push_back()
末尾删除元素 vec.pop_back()
任意位置插入元素 vec.insert()
任意位置删除元素: vec.erase()
交换两个向量元素 vec.swap()
清空向量元素 vec.clear()
*/
测试代码
1 int main() {
2 int i;
3 vec2=vec4; //vector可以直接用另一个赋值;
4 for (i = 0; i < vec2.size(); i++) {
5 cout << vec2[i] << endl;
6 }
7 cout << vec2.size() << ends << vec2.capacity() << endl;
8 //vector assign() 的三种用法
9 vec2.assign(3,7); //3个7
10 vec2.assign(arr, arr + 3); //迭代器 数组名 0 1 2 不包括arr+3
11 vec2.assign({ 1,56,89 }); //无名数组的方法进行赋值
12 //vector insert()函数的三种用法
13 vector<char> avector;
14 for (int i = 0; i < 10; i++) {
15 avector.push_back(i + 65);
16 }
17 avector.insert(avector.begin(), 5, 'C');// 1. 在指定loc 前插入val元素,返回指向这个元素的迭代器
18 avector.insert(avector.begin() + 2, 6); //2. 在指定位置loc前插入num个值为val的元素
19 avector.insert(avector.begin()+1,avector.begin(),avector.end()); //3.在指定位置loc前插入区间(start,end) 的所有元素
20 vector<char>::iterator it = avector.begin();
21 for (; it != avector.end(); it++) {
22 cout << *it << ends;
23 }
24 cout << endl;
25
26 //vector erase()函数的用法
27 //earse的返回值是返回被删除元素向后的一个元素
28 //vector中erase的作用是删除掉某个位置position或一段区域
29 //(begin, end)中的元素,减少其size。
30 for (it = avector.begin(); it != avector.end();) {
31 it = avector.erase(it);
32 }
33 for (; it != avector.end(); it++) {
34 cout << *it << ends;
35 }
36 cout << endl;
37 //vector swap()用法
38 cout << tmp.size() << ends << tmp.capacity() << endl;
39 tmp.erase(tmp.begin()+1);
40 cout << tmp.size() << ends << tmp.capacity() << endl;
41 tmp.swap(vec);
42 cout << tmp.size() << ends << tmp.capacity() << endl;
43 for (i = 0; i < vec2.size(); i++) {
44 cout << vec2[i] << endl;
45 }
46 vec2.shrink_to_fit();
47 cout << vec2.size() << ends << vec2.capacity() << endl;
48 return 0;
49 }
//3.迭代器
/*
开始指针vec.begin()
末尾指针: vec.end()
指向常量的开始指针: vec.cbegin()
指向常量的末尾指针: vec.cend()
*/
//4.元素的访问
/*
下标访问: vec[1] //并不会检查是否越界
at方法访问: vec.at[1] //两者的区别就是at会检查是否越界,
是就会抛出out of range异常
访问第一个元素: vec.front()
访问最后一个元素: vec.back()
******* C++11的特性
返回一个指针: int*p=vec.data() // vector在内存中是一个数组,
可以返回一个指针指向这个数组
*/
测试代码
1 int main() {
2 vector<char> ave,ml;
3 for (int i = 0; i < 26; i++) {
4 ave.push_back(i + 65);
5 }
6 vector<char>::iterator it = ave.begin();
7 for (; it != ave.end(); it++) {
8 cout << *it << ends;
9 }cout << endl;
10 //元素翻转
11 reverse(ave.begin(), ave.end());
12 for (it = ave.begin(); it != ave.end(); it++) {
13 cout << *it << ends;
14 }cout << endl;
15 //reverse_copy() reverse_copy(sourceBeg,sourceEnd,destBeg)
16 //将源区间soureBeg sourceEnd 内的元素复制到以destBeg起始的目标区间
17 //并颠倒安置次序
18 reverse_copy(ave.begin(), ave.end(),ml.begin());
19 //元素排序
20 //sort(vec.begin(), vec.end());
21 for (it = ml.begin(); it != ml.end(); it++) {
22 cout << *it << ends;
23 }cout << endl;
24 return 0;
25 }
本人水平有限如有问题欢迎指出
- 【动手实践】Oracle 12.2 新特性:自动的列表分区创建
- AI从业者搞懂---这10种深度学习方法---老婆孩子热炕头
- OpenCV从零基础---检测及分割图像的目标区域
- Spark资源调优
- Tensorflow实战:Discuz验证码识别
- 【动手实践】:Lockdown Profile 的多租户权限控制
- 异步的JavaScript和XML(AJAX)
- JavaScript实现登录注册验证
- jQuery右侧滑动快速导航条
- PHPExcel 表格导入数据代码解析(二)
- php Array数组知识总结
- 抓取远程图片到本地,你会用什么函数?
- ajax异步提交数据到数据库
- ThinkPHP page分页类的学习
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 使用GithubActions自动部署应用到自己的服务器(ECS)
- Nuxt项目给script标签添加crossorigin属性
- Canvas系列(12):动画高级
- Canvas系列(13):实战--星空连线图
- VSCode支持Vue自动保存格式化的配置
- 构造方法或new返回该对象
- 使用Node在浏览器打开某个网页
- 快应用初探--把个人博客封装成快应用
- 10分钟开发一个npm全局依赖包(上)
- 10分钟开发一个npm全局依赖包(下)
- Canvas系列(3):路径与状态
- Canvas系列(4):线条操作
- Canvas系列(6):绘制图片
- Canvas系列(7):形变
- Canvas系列(8):像素操作