【C++】vector的使用

文章目录

  • [1. vector的介绍](#1. vector的介绍)
  • [2. vector的使用](#2. vector的使用)
    • [1. 构造函数及拷贝构造函数](#1. 构造函数及拷贝构造函数)
    • [2. 析构函数](#2. 析构函数)
    • [3. 赋值运算符重载](#3. 赋值运算符重载)
    • [4. 迭代器](#4. 迭代器)
    • [5. capacity相关接口](#5. capacity相关接口)
    • [6. 元素访问相关接口](#6. 元素访问相关接口)
    • [7. 元素修改相关接口](#7. 元素修改相关接口)
    • [8. 附加](#8. 附加)
    • [9. 与string的区别](#9. 与string的区别)

1. vector的介绍

vector是一个可以改变大小的顺序表,本质是一个类模板,使用时必须显式实例化

2. vector的使用

注意,vector的使用是需要包含相应的头文件的

1. 构造函数及拷贝构造函数

  1. vector我们是可以默认不传参的,它会通过空间配置器来创建一个vector(这里我们不做讲述)
  2. 可以通过指定n个指定类型来创建vector
  3. 可以通过迭代器来创建vector,这个迭代器的类型可以是vector的也可以是其他类型的,但是vector和string的迭代器本质上都是指针,所以我们在创建vector时也可以传指针
  4. 拷贝构造传vector类型的对象即可
cpp 复制代码
#include<iostream>
#include<vector>
using namespace std;

void test1()
{
	vector<int> v1;
	vector<int> v2(3, 1);
	vector<int> v3(v2.begin(), v2.end());

	int arr[5] = { 1, 2, 3, 4, 5 };
	vector<int> v4(arr, arr + sizeof(arr) / sizeof(arr[0]));

	vector<int> v5(v4);
}

int main()
{
	test1();
	return 0;
}

2. 析构函数

  1. 析构函数我们了解一下就行,只是做资源清理的,后续我们在实现中会自己实现
  2. 值得一提的是,有了string的基础之后,我们要知道析构函数我们一定是要显式实现的,上面说的构造函数同理

3. 赋值运算符重载

  1. 到现在大家一定要能区分拷贝构造和赋值运算符重载的区别,我们在之前的类和对象中已经进行了比较>>>点击查看详情<<<
  2. 利用赋值运算符重载可以让我们直接覆盖掉指定对象的原始内容,下面的调试过程就可以看出v5的原始数据被v2覆盖了

4. 迭代器

  1. 这里分别是对应的正向迭代器和反向迭代器以及const对象对应的正向迭代器和反向迭代器
  2. 我们要记住迭代器是左闭右开的
  3. vector的迭代器本质其实是指针
  4. 由于不同类要使用的迭代器不同,所以迭代器iterator的使用要声明类域,即声明是哪一个类的迭代器
cpp 复制代码
void test2()
{
	vector<int> v(5, 1);
	vector<int>::iterator it = v.begin();
	int i = 1;
	while (it != v.end())
	{
		(*it) += i;
		cout << *it << " ";
		it++;
		i++;
	}
	cout << endl;

	for (auto x : v)
		cout << x << " ";
}

int main()
{
	test2();
	return 0;
}

5. capacity相关接口

  1. size就是返回vector的大小,专业点说是返回vector类模板实例化的对象中的有效数据个数
  2. max_size返回该vector中能容纳的最大元素数,基本不用
  3. resize可以调整vector的大小,并将数据更新为指定的val值,如果指定调整的大小大于原始大小并且没有指定val值的话会默认追加0,可以缩容扩容
  4. capacity返回给指定vector分配的空间大小
  5. empty判断指定vector是否为空,如果为空则返回true否则返回false
  6. reserve可以调整vector的大小,可以避免频繁扩容,一般不缩容
  7. shrink_to_fit可以让vector的大小缩至有效个数的大小,用的地方太少了
cpp 复制代码
void test3()
{
	vector<int> v(5, 1);
	cout << v.size() << endl;
	cout << v.max_size() << endl;
	v.resize(10, 2);
	cout << v.capacity() << endl;
	cout << v.empty() << endl;
	v.reserve(15);
	cout << v.capacity() << endl;
}

int main()
{
	test3();
	return 0;
}

6. 元素访问相关接口

  1. 的重载可以和我们前面演示的范围for做一个对比,一个是由迭代器支持的元素访问,一个是由\[\]重载支持的下标访问
  2. 在 重载的光芒下at就显得太渺小了,at也可以进行下标访问,但是跟 重载比起来太逊了
  3. front和back分别可以返回第一个位置和最后一个位置的数据的引用
  4. data用于返回指向指定的那块存储空间的首地址,类似于c_str的应用
cpp 复制代码
void test4()
{
	vector<int> v(10, 1);
	for (int i = 0; i < v.size(); i++)
	{
		v[i] += i;
		cout << v[i] << " ";
	}

	cout << endl;

	for (int i = 0; i < v.size(); i++)
		cout << v.at(i) << " ";
	cout << endl;
	cout << v.front() << " " << v.back() << endl;
	cout << v.data() << endl;
}

int main()
{
	test4();
	return 0;
}

7. 元素修改相关接口

  1. assign是一种赋值接口,可以用n个val值来赋值,也可以使用迭代器区间来赋值,不过平常不怎么用,我们也就不演示了
  2. push_back就经常用了,可以在原始vector的最后一个数据后面插入一个数据
  3. 对应的pop_back就是删除原始的vector的最后一个数据
  4. insert可以指定从一个迭代器位置插入数据,可以是一个也可以是多个,甚至可以插入一段迭代器区间,不过这里会涉及迭代器失效的问题,我们等后面的vector实现再来讨论
  5. erase是用来删除数据的,传入迭代器即可,可以删除指定的某个元素也可以删除一段迭代器区间,不过这里也会涉及上面所说的迭代器失效的问题
  6. swap可以交换两个vector类模板实例化出的对象的内容,比起算法库中的swap效率会更好
  7. clear可以清除数据,让其大小变为0
  8. emplace系列我们现在先不讨论,我们暂时也用不上
cpp 复制代码
void test5()
{
	vector<int> v(3, 1);
	vector<int> _v(6, 6);
	cout << v.size() << " " << v[0] << endl;
	v.assign(5, 2);
	cout << v.size() << " " << v[0] << endl;
	v.push_back(9);
	cout << v.size() << " " << v[v.size() - 1] << endl;
	v.pop_back();
	cout << v.size() << " " << v[v.size() - 1] << endl;
	v.insert(v.begin() + 1, 4);
	cout << v.size() << " " << v[1] << endl;
	v.erase(v.begin() + 1);
	cout << v.size() << " " << v[1] << endl;
	v.swap(_v);
	cout << v.size() << " " << v[0] << endl;
	v.clear();
	cout << v.size() << endl;

}

int main()
{
	test5();
	return 0;
}

8. 附加

看到这里相信一些细心的朋友可以发现vector中没有find啊,这里vector并没有相关的接口,但是我们可以在算法库中调用find函数,同时排序sort函数也是包括在算法库中的

9. 与string的区别

相信看了这些接口后,大家会想到字符的vector和string有什么区别,其实最最直接的就是string有\0而vector是没有的,所以vector是适配不了C语言的,比如c_str等接口

相关推荐
局部有解6 分钟前
Hot100 - 三数之和
数据结构·c++·算法
longlongzihan22 分钟前
C++ 常用数据结构速查:vector、stack、queue、list、树、图、哈希表等声明与核心操作
数据结构·c++·list
别动我齐刘海41 分钟前
实时控制学习2
linux·c++·人工智能·学习·算法
hetao17338372 小时前
校内场-提高组 ZYZSC-S-Round 2
c++·算法
hetao17338372 小时前
2026-10-14 hetao1733837 的刷题记录
c++·算法
浅念-3 小时前
动态规划:线性DP——多状态DP与子数组专题笔记
c++·笔记·算法·leetcode·职场和发展·动态规划·力扣
StarRocks_labs6 小时前
StarRocks 接入 Paimon C++:让湖上查询进入原生执行链路
starrocks·c++·sql·jni·paimon·auto·湖上查询
垆边人似月.6 小时前
华为题:字符串中最长连续数字串
开发语言·c++·算法
罗湖老棍子6 小时前
座位安排(洛谷-P2071)
c++·算法·图论·匈牙利算法·二分图匹配
IOT那些事儿6 小时前
C++17和20版本差异
c++·mingw·msvc