【C++】学习笔记——vector_1

文章目录


七、vector

vector

1. vector的介绍

学了 string类 后,学习其他容器就非常简单了。

vector 是表示可变大小数组的序列容器。就是高配版数组。用法就是 vector< class T> name 。

2. vector的使用

其实没什么说的,直接上手吧,和 string 差不多。

cpp 复制代码
#include<iostream>
// 包含头文件
#include<vector>
using namespace std;

int main()
{
	// 一个 vector 容器,存储的数据类型是 int ,对象名叫做 v
	vector<int> v;

	// 尾插
	v.push_back(1);
	v.push_back(2);
	v.push_back(3);
	v.push_back(4);

	// 可以下标 + [] 访问
	for (size_t i = 0; i < v.size(); ++i)
	{
		cout << v[i] << " ";
	}
	cout << endl;

	// 可以使用迭代器访问
	vector<int>::iterator it = v.begin();
	while (it != v.end())
	{
		cout << *it << " ";
		++it;
	}
	cout << endl;

	// 可以 范围for 访问
	for (auto e : v)
	{
		cout << e << " ";
	}
	cout << endl;

	return 0;
}

还可以这样构造:

cpp 复制代码
#include<iostream>
#include<vector>
using namespace std;

int main()
{
	// 初始化 10个1
	vector<int> v(10, 1);
	for (auto e : v)
	{
		cout << e << " ";
	}
	cout << endl;
	return 0;
}

其他的看看文档即可,我们现在来看看 vector 的扩容机制。

cpp 复制代码
#include<iostream>
#include<vector>
using namespace std;

int main()
{
	size_t sz;
	vector<int> v;
	sz = v.capacity();
	// 初始容量
	cout << sz << endl;
	cout << "making v grow:\n";
	for (int i = 0; i < 100; ++i)
	{
		v.push_back(i);
		// 发生扩容
		if (sz != v.capacity())
		{
			sz = v.capacity();
			cout << "capacity changed: " << sz << '\n';
		}
	}
	return 0;
}

规律比较好找,就是 扩容1.5倍,向上取整 。在 linux环境下是 2倍扩容 。

cpp 复制代码
#include<iostream>
#include<vector>
using namespace std;

int main()
{
	vector<int> v;
	// 10 个 0
	v.resize(10, 0);
	for (auto e : v)
	{
		cout << e << " ";
	}
	cout << endl;
	return 0;
}

resize 可以改变内容

resize 和 reserve 都不能够缩容,有一个接口可以缩容,那就是 shrink_to_fit,它会将 capacity 缩小到 size 大小。

在数据访问操作中:

下标 + [] 访问 是通过断言来处理越界而 at 则是通过抛异常处理越界

vector 只有尾插尾删,没有头插头删(可以通过 inserterase 来解决),因为顺序表头插头删效率很低,代价很大。

vector 里并没有 find 函数,但是算法库 < algorithm > 里面有 find 函数模板,使用 find 函数时,包含一下算法库即可。

cpp 复制代码
#include<iostream>
#include<vector>
// 包含算法库
#include<algorithm>
using namespace std;

int main()
{
	vector<int> v;
	v.push_back(1);
	v.push_back(2);
	v.push_back(3);
	v.push_back(4);
	v.push_back(5);

	for (auto e : v)
	{
		cout << e << " ";
	}
	cout << endl;

	// find 会在一段区间内 找 value, 找不到时返回 右区间
	vector<int>::iterator pos = find(v.begin(), v.end(), 3);
	if (pos != v.end())
	{
		// 在 pos 位置插入 30
		v.insert(pos, 30);
	}

	for (auto e : v)
	{
		cout << e << " ";
	}
	cout << endl;
	return 0;
}

insert 也可以插入一段迭代器区间 ,即使不是自己的迭代器。

cpp 复制代码
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;

int main()
{
	vector<int> v;
	v.push_back(1);
	v.push_back(2);
	v.push_back(3);
	v.push_back(4);
	v.push_back(5);

	for (auto e : v)
	{
		cout << e << " ";
	}
	cout << endl;

	string s = "ABCDE";
	v.insert(v.begin(), s.begin(), s.end());

	for (auto e : v)
	{
		cout << e << " ";
	}
	cout << endl;
	return 0;
}


vector 是一个对象数组,不要局限于内置类型,要放开思维。

cpp 复制代码
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;

int main()
{
	vector<string> v;

	v.push_back("QWERTYUIOP");
	// 本质上是匿名对象
	v.push_back(string("ASDFGHJKL"));
	v.push_back("ZXCVBNM");
	for (auto e : v)
	{
		cout << e << endl;
	}
	return 0;
}


vector 是个模板,存任意类型都可以,如果 vector 里存的是 vector 类型,则就是二维数组。

cpp 复制代码
// 二维数组
vector<vector<int>> vv;

未完待续

相关推荐
招摇的一半月亮4 小时前
P2242 公路维修问题
数据结构·c++·算法
f***01935 小时前
CC++链接数据库(MySQL)超级详细指南
c语言·数据库·c++
合方圆~小文5 小时前
球型摄像机作为现代监控系统的核心设备
java·数据库·c++·人工智能
椰萝Yerosius6 小时前
[题解]2024CCPC郑州站——Z-order Curve
c++·算法
滨HI09 小时前
C++ opencv简化轮廓
开发语言·c++·opencv
学习路上_write9 小时前
FREERTOS_互斥量_创建和使用
c语言·开发语言·c++·stm32·单片机·嵌入式硬件
闻缺陷则喜何志丹10 小时前
【SOSDP模板 容斥原理 逆向思考】3757. 有效子序列的数量|分数未知
c++·算法·力扣·容斥原理·sosdp·逆向思考
BestOrNothing_201511 小时前
一篇搞懂 C++ 重载:函数重载 + 运算符重载,从入门到会用(含 ++、<<、== 实战)
c++·函数重载·运算符重载·operator·前置后置++·重载与重写
2501_9411444211 小时前
Python + C++ 异构微服务设计与优化
c++·python·微服务
程序猿编码11 小时前
PRINCE算法的密码生成器:原理与设计思路(C/C++代码实现)
c语言·网络·c++·算法·安全·prince