
std::vector 是C++标准模板库(STL)中的一个非常重要的容器类,它提供了一种动态数组的功能。能够存储相同类型的元素序列,并且可以自动管理存储空间的大小,以适应序列大小变化,处理元素集合的时候很灵活
1. vector的定义
| 构造函数声明 | 接口说明 | 
| vector(); | 无参构造 | 
| vector( size_t n, const value_type& val = value_type()); | 构造并初始化n个val | 
| vector(const vector& x); | 拷贝构造 | 
| vector(InputIterator first, InputIterator last); | 使用迭代器进行初始化构造 | 
代码如下
#include<iostream>
#include<vector>
//using namespace std;
using std::vector;
using namespace std;
int main()
{
	vector<int> v1;
	for (size_t i = 0; i < v1.size(); i++)
	{
		cout << v1[i] << "  ";
	}
	cout << endl;
	vector<int> v2(10);
	vector<int> v3(10, 6);
	for (size_t i = 0; i < v2.size(); i++)
	{
		cout << v2[i] << "," << v3[i] << "    ";
	}
	cout << endl;
	vector<int> v4(v2);
	for (size_t i = 0; i < v4.size(); i++)
	{
		cout << v4[i] << "  ";
	}
	cout << endl;
	vector<int> v5(v3.begin(), v3.begin() + 2);
	for (size_t i = 0; i < v5.size(); i++)
	{
		cout << v5[i] << "  ";
	}
	cout << endl;
}其中v1是无参默认构造, v2是利用了缺省值全初始化为0,v3是初始化n个 6,v4是用v2进行拷贝构造,v5则是利用迭代器进行构造
输出结果如下

2. 迭代器iterator的使用
| iterator的使用 | 接口说明 | 
| begin+end | 获取第一个位置数据的iterator/const_iterator,获取最后一个数据的下一个位置的iterator/const_iterator | 
| rbegin+rend | 获取最后一个数据位置的reverse_iterator,获取第一个数据前一个位置的reverse_iterator | 
如下图所示

使用代码如下
#include<iostream>
#include<vector>
//using namespace std;
using namespace std;
int main()
{
	vector<int> v(10,6);
	v.push_back(1);
	//vector<int>::iterator it = v.begin();
	auto it = v.begin();
	while (it != v.end())
	{
		cout << *it << "  ";
		it++;
	}
	cout << endl;
	vector<int>::reverse_iterator iv = v.rbegin();
	while (iv != v.rend())
	{
		cout << *iv << "  ";
		iv++;
	}
	cout << endl;
}
输出结果如下

使用iterator不可以vector::iterator it = v.begin(); 因为vector是一个模板类需要指定其存储元素的类型。直接写没指定vector具体类型,编译器不知道就会报错(比如可能是vector<double>,vector<int>等)。当然也可以直接用auto自动识别。
3. vector空间增长问题
| 成员函数 | 接口说明 | 
| size | 获取数据个数 | 
| capacity | 获取容量大小 | 
| empty | 判断是否为空 | 
| resize | 改变vector的元素个数(size) | 
| reserve | 改变vector的容量(capacity) | 
(1). size与capacity
用以下代码验证vector动态增长
#include<iostream>
#include<vector>
//using namespace std;
using namespace std;
int main()
{
	vector<int> v;
	size_t sz = v.capacity();
	cout << "容量为:" << sz << endl;
	cout << "元素个数:" << v.size() << endl;
	for (int i = 0; i < 100; i++)
	{
		v.push_back(i);
		if (sz != v.capacity())
		{
			sz = v.capacity();
			cout << "当前容量:" << sz << endl;
			cout << "当前元素个数:" << v.size() << endl;
		}
	}
}输出结果为下图

通过上图我们不难发现,在vs中运行每次增长1.5倍,向上取整
而g++下运行每次增长2倍,并不是所有的vector增容都是增长1.5倍或2倍的。具体增长是多少是看具体的需求定义的。vs是PJ版本STL,g++是SGI版本STL。
(2). empty与resize与reserve
reserve只负责开辟空间,如果确定要用多少空间,reserve可以缓解vector增容的代价缺陷问题。只影响capacity(),不影响size()
resize在开空间时还会进行初始化,会影响capacity()还会影响size()
如以下代码
#include<iostream>
#include<vector>
//using namespace std;
using namespace std;
int main()
{
	vector<int> v1;
	size_t sz = v1.capacity();
	cout << "v1容量为:" << sz << endl;
	cout << "v1元素个数:" << v1.size() << endl;
	if(v1.empty())
	{
		v1.reserve(100);
	}
	for (int i = 0; i < 100; i++)
	{
		v1.push_back(i);
		if (sz != v1.capacity())
		{
			sz = v1.capacity();
			cout << "v1当前容量:" << sz << endl;
			cout << "v1当前元素个数:" << v1.size() << endl;
		}
	}
	vector<int> v2;
	cout << "v2容量为:" << v2.capacity() << endl;
	cout << "v2元素个数:" << v2.size() << endl;
	v2.resize(10);
	cout << "v2当前容量为:" << v2.capacity() << endl;
	cout << "v2当前元素个数为:" << v2.size() << endl;
	for (int i = 0; i < v2.size(); i++)
	{
		cout << v2[i] << "  ";
	}
	cout << endl;
	vector<int> v3;
	cout << "v3容量为:" << v3.capacity() << endl;
	cout << "v3元素个数:" << v3.size() << endl;
	v3.resize(10, 3);
	cout << "v3当前容量为:" << v3.capacity() << endl;
	cout << "v3当前元素个数为:" << v3.size() << endl;
	for (int i = 0; i < v3.size(); i++)
	{
		cout << v3[i] << "  ";
	}
	cout << endl;
}输出结果为下图所示

可以验证我们以上说法
4. vector的增删查改
| vector的元素操作 | 接口说明 | 
| push_back | 尾插 | 
| pop_back | 尾删 | 
| find | 查找(算法模块实现,不是vector成员接口) | 
| insert | 在position(指定坐标)之前插入val | 
| erase | 删除position(指定坐标)位置的数据 | 
| swap | 交换两个vector的数据空间 | 
| operator[] | 重载运算符,使其能像数组一样访问 | 
//#include<iostream>
 //#include<vector>
 using namespace std;
 //using std::vector;
 //using namespace std;
 //int main()
 //{
 //    vector<int> v1;
 //    for (size_t i = 0; i < v1.size(); i++)
 //    {
 //        cout << v1[i] << "  ";
 //    }
 //    cout << endl;
 //    vector<int> v2(10);
 //    vector<int> v3(10, 6);
 //    for (size_t i = 0; i < v2.size(); i++)
 //    {
 //        cout << v2[i] << "," << v3[i] << "    ";
 //    }
 //    cout << endl;
 //    vector<int> v4(v2);
 //    for (size_t i = 0; i < v4.size(); i++)
 //    {
 //        cout << v4[i] << "  ";
 //    }
 //    cout << endl;
 //
 //    vector<int> v5(v3.begin(), v3.begin() + 2);
 //    for (size_t i = 0; i < v5.size(); i++)
 //    {
 //        cout << v5[i] << "  ";
 //    }
 //    cout << endl;
 //}
//#include<iostream>
 //#include<vector>
 using namespace std;
 //using namespace std;
 //int main()
 //{
 //    vector<int> v(10,6);
 //    v.push_back(1);
 //    //vector<int>::iterator it = v.begin();
 //    auto it = v.begin();
 //    while (it != v.end())
 //    {
 //        cout << *it << "  ";
 //        it++;
 //    }
 //    cout << endl;
 //    vector<int>::reverse_iterator iv = v.rbegin();
 //    while (iv != v.rend())
 //    {
 //        cout << *iv << "  ";
 //        iv++;
 //    }
 //    cout << endl;
 //}
//#include<iostream>
 //#include<vector>
 using namespace std;
 //using namespace std;
 //int main()
 //{
 //    vector<int> v;
 //    size_t sz = v.capacity();
 //    cout << "容量为:" << sz << endl;
 //    cout << "元素个数:" << v.size() << endl;
 //    for (int i = 0; i < 100; i++)
 //    {
 //        v.push_back(i);
 //        if (sz != v.capacity())
 //        {
 //            sz = v.capacity();
 //            cout << "当前容量:" << sz << endl;
 //            cout << "当前元素个数:" << v.size() << endl;
 //        }
 //    }
 //}
 #include<iostream>
 #include<vector>
 //using namespace std;
 using namespace std;
 int main()
 {
     vector<int> v1;
     size_t sz = v1.capacity();
     cout << "v1容量为:" << sz << endl;
     cout << "v1元素个数:" << v1.size() << endl;
     if(v1.empty())
     {
         v1.reserve(100);
     }
     for (int i = 0; i < 100; i++)
     {
         v1.push_back(i);
         if (sz != v1.capacity())
         {
             sz = v1.capacity();
             cout << "v1当前容量:" << sz << endl;
             cout << "v1当前元素个数:" << v1.size() << endl;
         }
     }
     vector<int> v2;
     cout << "v2容量为:" << v2.capacity() << endl;
     cout << "v2元素个数:" << v2.size() << endl;
     v2.resize(10);
     cout << "v2当前容量为:" << v2.capacity() << endl;
     cout << "v2当前元素个数为:" << v2.size() << endl;
     for (int i = 0; i < v2.size(); i++)
     {
         cout << v2[i] << "  ";
     }
     cout << endl;
     vector<int> v3;
     cout << "v3容量为:" << v3.capacity() << endl;
     cout << "v3元素个数:" << v3.size() << endl;
     v3.resize(10, 3);
     cout << "v3当前容量为:" << v3.capacity() << endl;
     cout << "v3当前元素个数为:" << v3.size() << endl;
     for (int i = 0; i < v3.size(); i++)
     {
         cout << v3[i] << "  ";
     }
     cout << endl;
 }



















