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;
}
相关推荐
SoraLuna24 分钟前
「Mac畅玩鸿蒙与硬件47」UI互动应用篇24 - 虚拟音乐控制台
开发语言·macos·ui·华为·harmonyos
xlsw_29 分钟前
java全栈day20--Web后端实战(Mybatis基础2)
java·开发语言·mybatis
Dream_Snowar2 小时前
速通Python 第三节
开发语言·python
唐诺2 小时前
几种广泛使用的 C++ 编译器
c++·编译器
高山我梦口香糖2 小时前
[react]searchParams转普通对象
开发语言·前端·javascript
冷眼看人间恩怨3 小时前
【Qt笔记】QDockWidget控件详解
c++·笔记·qt·qdockwidget
信号处理学渣3 小时前
matlab画图,选择性显示legend标签
开发语言·matlab
红龙创客3 小时前
某狐畅游24校招-C++开发岗笔试(单选题)
开发语言·c++
Lenyiin3 小时前
第146场双周赛:统计符合条件长度为3的子数组数目、统计异或值为给定值的路径数目、判断网格图能否被切割成块、唯一中间众数子序列 Ⅰ
c++·算法·leetcode·周赛·lenyiin
jasmine s3 小时前
Pandas
开发语言·python