vector是STL容器中最基础的容器,它内部通过一个动态数组实现。也可以理解成C++普通数组的升级版。主要有以下特点:

1、支持动态扩容:可以根据需要增加或者减少存储空间,元素在内存中是连续存储的。

2、因为其内部使用动态数组实现,所以支持高速访问,可以直接通过索引访问,访问速度快。

3、自动内存管理:不需要手动释放内存,vector容器会自动管理内存。

4、插入和删除的时间复杂度较高,因为每次插入和删除操作都会移动大量的数组中的元素。

容器的大概为代码如下:

template<typename T>
class vector {
    T* _data;        // 指向动态分配的数组
    size_t _size;    // 当前元素个数
    size_t _capacity;// 当前分配的容量
    // ...
};

容器的创建

#include <iostream>
#include <vector>
using namespace std;
int main()
{
	//方法一:默认创建空vector容器 不会分配内存
	vector<int> values;
	//容器扩容到指定大小
	values.reserve(20);

	//方法二:创建容器的同时 初始化容器中的元素
	vector<int> values2 = { 1,2,3,4,5,6,8,5,74,8,9, };
	//方法三:初始化容器时,指定容量capacity大小,并且可以使用默认值初始化所有元素
	vector<int> values3(10, 0);
	//方法四:通过其他容器来初始化一个新的容器
	vector<int> values4(values3); 
}

新增元素

向vector容器新增元素主要有push_backinsert两个方法,push_back向容器的尾部新增一个元素,insert可以向容器的任意索引处新增一个元素。

#include <iostream>
#include <vector>
using namespace std;
int main()
{
	vector<int> values;
	//向容器尾部添加一个元素
	values.push_back(1);
	values.push_back(2);
	for (auto i = values.begin(); i < values.end(); i++)
	{
		cout << *i << " ";
	}

	values.insert(values.begin() + 1, 3);
	for (auto i = values.begin(); i < values.end(); i++)
	{
		cout << *i << " ";
	}
}

移除元素

移除容器中的元素,主要用到pop_backeraseclear三个方法,pop_back删除容器的最后一个元素,erase删除指定索引处的元素,clear清空容器中的所有元素。

#include <iostream>
#include <vector>
using namespace std;
void PrintVector(vector<int>& v)
{
	for (auto i = v.begin(); i < v.end(); i++)
	{
		cout << *i << " ";
	}
	cout << endl;
}
int main()
{
	vector<int> values;
	//向容器尾部添加三个元素
	values.push_back(1);
	values.push_back(2);
	values.push_back(3);
	values.push_back(4);
	values.push_back(5);
	//删除最后一个元素
	values.pop_back(); 
	PrintVector(values);

	//移除指定索引处的元素
	values.erase(values.begin() + 1);
	PrintVector(values);

	cout << "元素大小" << values.size() << endl;
	values.clear(); //清空容器
	cout << "元素大小" << values.size() << endl;
}

resize函数:调整容器元素大小

vector的resize函数用于改变容器元素的大小,主要作用是扩大容器和缩小容器。

1、当指定的值大于当前元素个数,vector会在末尾添加默认元素。使容器中元素的大小扩大到指定值。

2、当指定的小于当前元素个数,vector会删除默认的元素。使容器中元素的大小缩小到指定值。

#include <iostream>
#include <vector>
using namespace std;
void PrintVector(vector<int>& v)
{
	for (auto i = v.begin(); i < v.end(); i++)
	{
		cout << *i << " ";
	}
	cout << endl;
}
int main()
{
	vector<int> values;
	//向容器尾部添加三个元素
	values.push_back(1);
	values.push_back(2);
	values.push_back(3);
	values.push_back(4);
	values.push_back(5);
	values.resize(10); //扩展容器大小为10
	PrintVector(values);
}

执行结果如下:

当我们将resize的参数从10改成3之后,容器中元素会缩小。执行结果如下:可以看到,原来5个元素的后面两个被移除掉了。

迭代器:正向迭代器、逆向迭代器、常量迭代器

(1)、 顺序迭代器:当正向遍历容器的时候使用

begin():返回指向第一个元素的迭代器(正向,读写)。

end():返回指向最后一个元素的下一个位置的迭代器(正向,读写)。

(2)、 反向迭代器:当逆向遍历容器的时候使用

rbegin():返回指向最后一个元素的反向迭代器(逆序遍历,读写)。

rend():返回指向第一个元素前一个位置的反向迭代器(逆序遍历,读写)。

(3)、常量迭代器(只读):在顺序迭代器和反向迭代器的基础上增加了const,不允许修改对应的元素值。

cbegin():返回指向第一个元素的常量迭代器(正向,只读)。

cend():返回指向最后一个元素的下一个位置的常量迭代器(正向,只读)。

 crbegin():返回指向最后一个元素的常量反向迭代器(逆序,只读)。  

crend():返回指向第一个元素前一个位置的常量反向迭代器(逆序,只读)。

#include <iostream>
#include <vector>
using namespace std;
int main()
{
	vector<int> values;
	//向容器尾部添加三个元素
	values.push_back(1);
	values.push_back(2);
	values.push_back(3);
	values.push_back(4);
	values.push_back(5);
	for (auto i = values.begin(); i < values.end(); i++)
	{
		cout << *i << " ";
	}
	cout << endl;
    for (auto i = values.rbegin(); i != values.rend(); ++i)
    {
        cout << *i << " ";
    }
}

执行结果如下:

shrink_to_fit:将内存减少到等于当前元素实际所使用的大小。

这个函数相当于将动态数组尾部没有填充的元素全部删掉。

#include <iostream>
#include <vector>
using namespace std;
int main()
{
	vector<int> values;
	//向容器尾部添加三个元素
	values.push_back(1);
	values.push_back(2);
	values.push_back(3);
	values.push_back(4);
	values.push_back(5);
	values.reserve(10);
	cout << "容量" << values.capacity() << endl;
	values.shrink_to_fit();
	cout << "容量" << values.capacity() << endl;
}

执行效果如下:

其他常用vector函数

#include <iostream>
#include <vector>
using namespace std;

int main()
{
	vector<int> values;
	//向容器尾部添加三个元素
	values.push_back(1);
	values.push_back(2);
	values.push_back(3);
	values.push_back(4);
	values.push_back(5);
	cout << "元素容量:" << values.capacity() << endl;
	cout << "元素个数:" << values.size() << endl;
	cout << "元素最大个数(很大):" << values.max_size() << endl;
	cout << "元素是否为空:" << values.empty() << endl;
	cout << "第n 个元素引用:" << values.at(1) << endl;
	cout << "第一个元素引用:" << values.front() << endl;
	cout << "最后一个元素引用:" << values.back() << endl;
	cout << "动态数组的指针:" << *values.data() << endl;

}

执行效果如下: