C++ —— 关于vector

目录

链接

[1. vector的定义](#1. vector的定义)

[2. vector的构造](#2. vector的构造)

[3. vector 的遍历](#3. vector 的遍历)

[4. vector 的扩容机制](#4. vector 的扩容机制)

[5. vector 的空间接口](#5. vector 的空间接口)

[5.1 resize 接口](#5.1 resize 接口)

[5.2 push_back](#5.2 push_back)

[5.3 insert](#5.3 insert)

[5.4 erase](#5.4 erase)

[5.5 流插入与流提取](#5.5 流插入与流提取)

[vector 并不支持流插入与流提取,但是可以自己设计,更加灵活方便](#vector 并不支持流插入与流提取,但是可以自己设计,更加灵活方便)

[6. vector 的不同类型元素](#6. vector 的不同类型元素)


链接

cplusplus.com/reference/vector/vector/https://cplusplus.com/reference/vector/vector/


1. vector的定义

|----------------------------------------------------------------|-------------------|
| (constructor)构造函数声明 | 接口说明 |
| vector() | 无参构造 |
| vector(size_type n, const value_type& val = value_type()) | 构造并初始化n个val |
| vector (const vector& x); | 拷贝构造 |
| vector (InputIterator first, InputIterator last); | 使用迭代器进行初始化构 造 |


2. vector的构造

复制代码
//模版类只能显式实例化
vector<int> v1;
vector<int> v2(10, 1);

//迭代器初始化
vector<int> v3(v2.begin(), v2.end());
vector<int> v4(++v2.begin(), --v2.end());

3. vector 的遍历

vector 与 string 的遍历相同,并且做了更多的优化

复制代码
void test_vector1()
{
	vector<int> v1;
	vector<int> v2(10, 1);

	vector<int> v3(++v2.begin(), --v2.end());

    //下标遍历
	for (size_t i = 0; i < v3.size(); i++)
	{
		cout << v3[i] << " ";
	}
	cout << endl;

    //迭代器遍历
	vector<int>::iterator it = v3.begin();
	while (it != v3.end())
	{
		cout << *it << " ";
		++it;
	}
	cout << endl;

    // 范围 for 遍历
	for (auto e : v3)
	{
		cout << e << " ";
	}
	cout << endl;
}

4. vector 的扩容机制

vector 的扩容机制 在 VS 环境下是1.5倍扩容,在 g++ 环境下是2倍扩容,和string相同

但是有一点不同:

那就是string 的 reverse 接口如果给出的值小于原来的容量那么就可能会缩容,但是 vector 的 reverse 接口如果给出一个小于原容量的值就不会缩容

复制代码
void TestVectorExpend()
{
	size_t sz;
	vector<int> v;
	sz = v.capacity();
	cout << "capacity changed :" << sz << "\n";
	cout << "make a grow" << endl;
	for (size_t i = 0; i < 100; i++)
	{
		v.push_back(i);
		if (sz != v.capacity())
		{
			sz = v.capacity();
			cout << "capacity changed :" << sz << "\n";
		}
	}
}

5. vector 的空间接口

|--------------|-----------------------|
| size | 获取数据个数 |
| capacity | 获取容量大小 |
| empty | 判断是否为空 |
| resize | 改变vector的size |
| reserve | 改变vector的capacity |


5.1 resize 接口

resize 接口是在原来 vector 对象的基础上进行添加数据

当然有两种情况:

一种是添加数据容量小于原来的size,就会减小size的值而不改变capacity的值(容量不变)

第二种情况就是大于size的值,就会根据给定的值来扩容

复制代码
vector<int> v(10, 1);
cout << v.size() << endl;
cout << v.capacity() << endl;

//小于size
v.resize(5, 2);
cout << v.size() << endl;
cout << v.capacity() << endl;
 
//大于size
v.resize(15, 2);
cout << v.size() << endl;
cout << v.capacity() << endl;


void test_vector3()
{
    //10个整形数据1
	vector<int> v(10, 1);
    //申请20空间
	v.reserve(20);
	cout << v.size() << endl;
	cout << v.capacity() << endl;

    //10个整形数据1,补上5个整形数据2
	v.resize(15, 2);
	cout << v.size() << endl;
	cout << v.capacity() << endl;

    //10个整形数据1,5个整形数据2,补上10个整形数据3
	v.resize(25, 3);
	cout << v.size() << endl;
	cout << v.capacity() << endl;
    
    //只保留5个数据
	v.resize(5);
	cout << v.size() << endl;
	cout << v.capacity() << endl;
}

通常 vector 支持迭代器插入


5.2 push_back

复制代码
//尾插
vector<int> v(10, 1);
v.push_back(10);
for (auto e : v)
{
	cout << e << " ";
}
cout << endl;

5.3 insert

复制代码
//头插
vector<int> v(10, 1);
v.insert(v.begin(), 1);
for (auto e : v)
{
	cout << e << " ";
}
cout << endl;

//第一个数+3之后在第三个位置进行插入
v.insert(v.begin() + 3, 1);
for (auto e : v)
{
	cout << e << " ";
}

5.4 erase

删除指定位置的数据

复制代码
//头删
vector<int> v(10, 1);
v.erase(v.begin());
for (auto e : v)
{
	cout << e << " ";
}
cout << endl;

//第一个数+3之后删除第三个位置的数据
v.erase(v.begin() + 3);
for (auto e : v)
{
	cout << e << " ";
}
cout << endl;

5.5 流插入与流提取

vector 并不支持流插入与流提取,但是可以自己设计,更加灵活方便

复制代码
vector<int> v(10);
for (size_t i = 0; i < v.size(); i++)
{
	cin >> v[i];
}
for (auto e : v)
{
	cout << e << " ";
}
cout << endl;

6. vector 的不同类型元素

vector不光可以存储int,double类型,还可以存储日期类,string,自定义类型,甚至还可以存储vector(也就是存储二维数组)

vector<vector<int>>:二维数组存放整数类型

复制代码
	//二维数组
    //5个元素的一维数组
	vector<int> v(5, 1);
    //开辟一个10行5列的二维数组
	vector<vector<int>> vv(10, v);

    vv[2][1]=1;
    //这两段代码的意思是相同的
    //vv.operator[](2)operator[](1)=2;

遍历

复制代码
	//二维数组
    //5个元素的一维数组
	vector<int> v(5, 1);
    //开辟一个10行5列的二维数组
	vector<vector<int>> vv(10, v);

	//使用下标遍历二维数组
	for (int i = 0; i < vv.size(); i++)
	{
		for (int j = 0; j < v.size(); j++)
		{
			cout << vv[i][j] << " ";
		}
		cout << endl;
	}

感谢观看~

相关推荐
智驱力人工智能1 小时前
基于视觉分析的人脸联动使用手机检测系统 智能安全管理新突破 人脸与手机行为联动检测 多模态融合人脸与手机行为分析模型
算法·安全·目标检测·计算机视觉·智能手机·视觉检测·边缘计算
悟能不能悟2 小时前
java的java.sql.Date和java.util.Date的区别,应该怎么使用
java·开发语言
2301_764441332 小时前
水星热演化核幔耦合数值模拟
python·算法·数学建模
循环过三天2 小时前
3.4、Python-集合
开发语言·笔记·python·学习·算法
_院长大人_3 小时前
设计模式-工厂模式
java·开发语言·设计模式
MATLAB代码顾问3 小时前
MATLAB实现决策树数值预测
开发语言·决策树·matlab
priority_key4 小时前
排序算法:堆排序、快速排序、归并排序
java·后端·算法·排序算法·归并排序·堆排序·快速排序
不染尘.5 小时前
2025_11_7_刷题
开发语言·c++·vscode·算法
似水এ᭄往昔5 小时前
【C++】--stack和queue
开发语言·c++
仰望—星空5 小时前
MiniEngine学习笔记 : CommandListManager
c++·windows·笔记·学习·cg·direct3d