C++ vector类

一. vector的介绍

vector就像数组一样,向量对其元素使用连续的存储位置,这意味着也可以使用指向其元素的常规指针上的偏移量来访问它们的元素,并且与在数组中一样高效。但与数组不同的是,它们的大小可以动态变化,其存储由容器自动处理。

在内部,向量使用动态分配的数组来存储其元素。可能需要重新分配此数组,以便在插入新元素时增加大小,这意味着分配一个新数组并将所有元素移动到该数组。就处理时间而言,这是一项相对昂贵的任务,因此,每次将元素添加到容器时,向量都不会重新分配。

二. vector的使用

2.1. vector的定义

|--------------------------------------------------------------|-----------------|
| 构造函数声明 | 功能说明 |
| vector() | 无参构造 |
| vector( size_type n, const value_type& val = value_type() ) | 用n个值为val的构造 |
| vector(const vector& x) | 用一个已存在的vector构造 |
| vector (InputIterator first, InputIterator last) | 用一段迭代区间构造 |

cpp 复制代码
void Test_vector1()
{
    vector<int> v1;//无参构造

    vector<int> v2(10,1);//用10个1进行构造

    vector<int> v3(v1);//用存在的vector来构造新的

    vector<int> v4(v2.begin(), v2.end());//用一段迭代区间来构造
}

2.2. vector iterator的使用

|-------------------|------------------------|
| iterator的使用 | 接口说明 |
| begin() + end() | 获取第一个位置的数据+获取最后一个位置的数据 |
| rbegin() + rend() | 获取最后一个位置的数据+获取第一个位置的数据 |

cpp 复制代码
void Test_vector(const vector<int>& v)
{
	// const对象使用const迭代器进行遍历打印
	vector<int>::const_iterator it = v.begin();
	while (it != v.end())
	{
		cout << *it << " ";
		++it;
	}
	cout << endl;
}

2.3. vector空间增长问题

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

  1. capacity的代码在vs和g++下分别运行会发现,**vscapacity是按1.5****倍增长的,**g++是按2
    倍增长的 。这个问题经常会考察,不要固化的认为, vector 增容都是 2 倍,具体增长多少是
    根据具体的需求定义的。 vs 是 PJ 版本 STL , g++ 是 SGI 版本 STL 。
  2. reserve 只负责开辟空间,如果确定知道需要用多少空间, reserve 可以缓解 vector 增容的代
    价缺陷问题。
  3. resize 在开空间的同时还要进行初始化,影响size。
cpp 复制代码
void Test_vector3()
{
	vector<int> v;

	for (int i = 1; i < 10; i++)
		v.push_back(i);

	v.resize(5);
	v.resize(8, 100);
	v.resize(12);

	cout << "v contains:";
	for (size_t i = 0; i < v.size(); i++)
		cout << ' ' << v[i];
	cout << endl;
}

2.4. vector的增删查改

|--------------|-----------------|
| vector的增删查改 | 接口说明 |
| push_back | 尾插 |
| pop_back | 尾删 |
| find | 查找 |
| insert | 在pos位置之前插入val |
| erase | 删除pos位置的值 |
| swap | 交换两个vector的数据空间 |
| operatot[] | 像数组一样访问 |

cpp 复制代码
void Test_vector4()
{
	vector<int> v;
	v.push_back(1);
	v.push_back(2);
	v.push_back(3);
	v.push_back(4);

	auto it = v.begin();
	while (it != v.end()) 
	{
		cout << *it << " ";
		++it;
	}
	cout << endl;

	v.pop_back();
	v.pop_back();

	it = v.begin();
	while (it != v.end()) 
	{
		cout << *it << " ";
		++it;
	}
	cout << endl;
}
cpp 复制代码
void Test_vector5()
{
	// 使用列表方式初始化,C++11新语法
	vector<int> v{ 1, 2, 3, 4 };

	// 在指定位置前插入值为val的元素,比如:3之前插入30,如果没有则不插入
	// 1. 先使用find查找3所在位置
	// 注意:vector没有提供find方法,如果要查找只能使用STL提供的全局find
	auto pos = find(v.begin(), v.end(), 3);
	if (pos != v.end())
	{
		// 2. 在pos位置之前插入30
		v.insert(pos, 30);
	}

	vector<int>::iterator it = v.begin();
	while (it != v.end()) 
	{
		cout << *it << " ";
		++it;
	}
	cout << endl;

	pos = find(v.begin(), v.end(), 3);
	// 删除pos位置的数据
	v.erase(pos);

	it = v.begin();
	while (it != v.end()) {
		cout << *it << " ";
		++it;
	}
	cout << endl;
}
cpp 复制代码
void Test_vector6()
{
	vector<int> v{ 1, 2, 3, 4 };

	// 通过[]读写第0个位置。
	v[0] = 10;
	cout << v[0] << endl;

	// 1. 使用for+[]小标方式遍历
	for (size_t i = 0; i < v.size(); ++i)
		cout << v[i] << " ";
	cout << endl;

	vector<int> swapv;
	swapv.swap(v);

	cout << "v data:";
	for (size_t i = 0; i < v.size(); ++i)
		cout << v[i] << " ";
	cout << endl;

	// 2. 使用迭代器遍历
	cout << "swapv data:";
	auto it = swapv.begin();
	while (it != swapv.end())
	{
		cout << *it << " ";
		++it;
	}

	// 3. 使用范围for遍历
	for (auto x : v)
		cout << x << " ";
	cout << endl;
}
相关推荐
satan–01 分钟前
R语言绘制三维散点图
开发语言·windows·vscode·信息可视化·数据分析·r语言·数据可视化
羑悻的小杀马特4 分钟前
RBTree(红黑树)的介绍和实现
数据结构·c++·红黑树
向阳12186 分钟前
使用Java Socket实现简单版本的Rpc服务
java·开发语言·rpc
奥特曼狂扁小怪兽12 分钟前
关于QT cmake项目添加了.ui文件build未自动生成ui_xxx.h,错误提示找不到这个头文件问题处理
开发语言·qt·ui
fmc12110440 分钟前
【前端】如何制作一个自己的网页(6)
开发语言·php
aa.17358031 小时前
剖析淘宝猫粮前五十店铺:销售策略、产品特点与用户偏好
开发语言·python·算法·数据挖掘
闭关苦炼内功1 小时前
30 天 Python 3 学习计划
开发语言·python·学习
深耕AI1 小时前
使用Windows创建一个MFC应用【带界面】
c++·windows·mfc
-代号95271 小时前
【云从】三、计算机网络基础
开发语言·计算机网络
兆。1 小时前
python项目实战——下载美女图片
开发语言·python·美女