IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> [C++STL] vector 可变长数组 用法详解 -> 正文阅读

[C++知识库][C++STL] vector 可变长数组 用法详解

前言

vector是一个常用的C++标准库类。
它可以和数组一样,在常数时间内实现随机访问。
不仅如此,vector类中封装的一些方法(如尾部快速插入,判空),使得它更加实用、强大。

索引

vector
? ? 一、初始化
? ? 二、(尾部)插入 弹出
? ? 三、随机访问
? ? 四、容器大小
? ? ? ? 1. 大小设置
? ? ? ? 2. 大小查询
? ? 五、容器遍历
? ? ? ? 1.使用迭代器遍历容器
? ? ? ? 2.使用下标遍历容器
? ? 六、其他(不常用)
? ? ? ? 1. 赋值
? ? ? ? 2. (指定位置)插入 删除
? ? ? ? 3. 容器清空


vector

vector定义在vector头文件中。
实用之前需要手动包含头文件.

#include<vector>

一、初始化

语法

  • vector vec :初始化一个存放type类型数据的vector空对象vec
  • vector vec1(vec2):使用vector对象vec2初始化对象vec1
  • vector vec(beg,end):使用[beg,end)地址区间内的元素初始化对象vecbegend可以是指针,或者迭代器。
  • vector vec(size):初始化一个元素个数为size的对象vec
  • vector vec(size,t):初始化一个元素个数为·size·,元素值为t的对象vec

代码示例

#include<vector>
vector<int> v1;
vector<int> v2(v1);
vector<int> v3(v1.begin(),v1.end());
vector<int> v4(5);
vector<int> v5(5,1);

二、(尾部)插入 弹出

语法

  • vector.push_back(t):在容器的尾部插入元素t
  • vector.pop_back():弹出(即删除)容器尾部元素。

代码示例

#include<vector>
using namespace std;
int main(){
	vector<int> v1;
	v1.push_back(12);	// 在尾部插入12
	v1.pop_back();		// 弹出尾部元素
	return 0;
}

三、随机访问

语法

  • v[idx]:使用[]运算符进行随机访问(类似于对数组元素进行访问)
  • v.at(idx):使用at方法进行随机访问,放回指定元素的引用。
    这两个方法都可以对vector对象进行随机访问。
  • v.front():返回对象v的首个元素的常引用。
  • v.back():返回对象v的最后一个元素的常引用。

ps:[]运算符和at方法都可以实现随机访问,不同的是at方法在访问时会进行访问检查,当访问超出容器范围时,会抛出out_of_range异常。

代码示例

#include<vector>
#include<iostream>
using namespace std;
int main(){
	vector<int> a;
	a.push_back(10);
	a.push_back(11);
	a.push_back(12);
	a.push_back(13);
	cout << a[0] << endl;
	a[0] ++;
	cout << a[0] << endl;
	cout << "========" << endl;
	cout << a.at(1) << endl;
	a.at(1) = 0;
	cout << a.at(1) << endl;
	cout << "========" << endl;
	cout << a.front() << endl;
	cout << "========" << endl;
	cout << a.back() << endl;
	return 0;
} 

输出

10
11
========
11
0
========
11
========
13

四、容器大小

1. 大小设置

  • v.resize(h,[val]):设置vector的长度为h
    - 如果h小于原本vector容器长度,那么从第h个元素开始往后的元素都将被销毁。
    - 如果h大于原本的vector容器长度,那么会从原本vector容器后面补全h个元素(如果指定了值val,那么会用val初始化新增加的值)。
    - 如果h同时大于capacity,那么会自动完成内存分配。
  • reserve(h) 改变当前vecotr所分配空间的大小。
    • 如果h的值大于当前capacity的大小,则会将容器内存分配至h
    • 如果h的值不大于当前capacity的大小,则不做出操作。

2. 大小查询

  • v.size():返回对象v当前元素个数
  • max_size():返回容器最大可能的分配到的空间大小
  • capacity():返回容器当前已分配到的空间大小(如果元素过多,将会自动为容器分配更多的空间
  • empty():返回一个布尔值,表示容器是否为空。

ps:其实这三个关于容器的函数很好理解:
就好比如有一个书架。

  • size方法反应书架上有多少的书。
  • capacity方法反应书架有多大。
  • max_size方法反应我们可以建造多大的书架。

代码示例

#include<vector>
#include<iostream>
using namespace std;
int main(){
	vector<int> v;
	v.resize(11);
	v.reserve(1123);
	cout << "size:" << v.size() << endl;
	cout << "capacity:" << v.capacity() << endl;
	cout << "max_size:" << v.max_size() << endl;
	return 0;
} 

输出

size:11
capacity:1123
max_size:536870911

五、容器遍历

vector容器遍历一般有两种办法

1.使用迭代器遍历容器

#include<vector>
#include<iostream>
using namespace std;
int main(){
	vector<int> v;
	v.push_back(1);
	v.push_back(2);
	v.push_back(3);
	v.push_back(4);
	for(vector<int>::iterator p = v.begin();p != v.end();p++)	// 顺序遍历 
		cout << *p << " ";
	cout << endl;
	for(vector<int>::reverse_iterator p = v.rbegin();p != v.rend();p++)	// 倒序遍历 
		cout << *p << " ";
	cout << endl;
	return 0;
} 

输出

1 2 3 4 
4 3 2 1 

ps:可以将vector<int>::iterator简写为auto,即让编译器自动识别变量类型。

2.使用下标遍历容器

#include<vector>
#include<iostream>
using namespace std;
int main(){
	vector<int> v;
	v.push_back(1);
	v.push_back(2);
	v.push_back(3);
	v.push_back(4);
	for(int i = 0;i < (signed)v.size();i++)	// 顺序遍历 
		cout << v[i] << " ";
	cout << endl; 
	for(int i = v.size() - 1;i >= 0;i--)
		cout << v[i] << " ";
	cout << endl;
	return 0;
} 

输出

1 2 3 4 
4 3 2 1 

使用下标进行遍历,这种方式和对数组进行遍历一样,所以更容易让人接受。
但使用下标遍历,可能会有潜在的效率问题。欢迎阅读我的另外一篇文章,进行深入了解→

六、其他(不常用)

1. 赋值

语法

  • v.aasign(beg,end):将[beg,end)地址区间的值赋给vector对象v
  • v.assign(n,val):将n个值val赋值给对象v
    调用该方法后,对象v原本的数据都会被销毁。
    当且仅当赋值后所需的内存大于容器原有内存时,系统会自动为容器重新分配内存。

代码示例

#include<iostream>
#include<vector>
using namespace std;
int main(){
	vector<int> a,b;
	a.push_back(5);
	a.push_back(3);
	cout << "赋值前:";
	for(auto p = a.begin();p != a.end();p++)
		cout << *p << " ";
	cout << endl;
	a.assign(5,1);
	cout << "赋值后:";
	for(auto p = a.begin();p != a.end();p++)
		cout << *p << " ";
	cout << endl;
	
	b.push_back(10);
	b.push_back(12);
	b.push_back(48);
	cout << "使用b赋值后:";
	a.assign(b.begin(),b.end());
	for(auto p = a.begin();p != a.end();p++)
		cout << *p << " ";
	cout << endl;
	return 0;
} 

输出

赋值前:5 3
赋值后:1 1 1 1 1
使用b赋值后:10 12 48

2. (指定位置)插入 删除

  • v.insert(ite,val):将值val插入到对象v的迭代器ite所对应的位置。
  • v.insert(ite,n,val):将n个值val插入到迭代器ite所对应的位置。
  • vl.insert(ite,beg,end):将区间[beg,end)中的值插入到迭代器ite的位置。
  • v.erase(ite):删除对象v中迭代器ite所对应位置的值。
  • v.erase(beg,end):删除对象v中区间[beg,end)位置的值。

由于inserterase的操作与迭代器关系较为紧密,且通常与find等其他函数结合才能发挥出其实际作用,因此在此不做深入探究。

如果您想要对vector的inserterase方法深入了解,欢迎关注我后续的文章→

3. 容器清空

  • v.clear():清空对象。
    ps:调用clear方法后,对象的size()变为0——即清空了元素,元素个数为0。
    capacity()不变——即不会重新进行内存分配。

参考资料

vector官方文档


原创不易,感谢您的支持。

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-08-12 16:25:18  更:2021-08-12 16:25:42 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/26 16:31:37-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码
数据统计