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;
}
相关推荐
跃渊Yuey4 分钟前
【C++笔记】vector使用详解及模拟实现
c++·笔记
CQU_JIAKE12 分钟前
11-9:【大数据】DEBUG
开发语言·python
Q81375746016 分钟前
智能算法引领金融创新:正大科技的智能分析框架
android·开发语言·kotlin
想不到好名字了()27 分钟前
个人C++复习知识点(1)
开发语言·c++
绵绵细雨中的乡音27 分钟前
第21课-C++[set和map学习和使用]
c++·学习
Source.Liu33 分钟前
Rust 整数
开发语言·rust
Yanbin_Q38 分钟前
从 Rust 官方文档理解 Ownership
开发语言·后端·rust
原来是猿1 小时前
类和对象(上)
c语言·开发语言·数据结构·c++·算法
码喽不秃头1 小时前
java中BigInteger类和BigDecimal类
java·开发语言
码界领航1 小时前
Dev C++ 无法使用to_string方法的解决
开发语言·c++