#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <vector>//vector翻译为向量,意思为动态数组,可变数组
using namespace std;
//vector容器为单口容器,类似于栈
//vector动态增长的基本原理:
//当插入新元素时,如果空间不足,那么vector会重新申请更大的一块内存空间,将原空间的数据拷贝到新空间,释放旧空间的数据,再把新元素插入新申请的空间
int main()
{
vector<int> v4;//默认构造
int arr1[] = { 3,5,7,9,1,4,8 };
//通过起始位置和最后一个元素的再后一个位置进行复制区间初始化
vector<int> v5(arr1, arr1 + sizeof(arr1) / sizeof(int));
vector<int> v6(v5.begin(), v5.end());//其实也是复制区间初始化
vector<int> v7(v5);//拷贝构造
vector<int>::iterator it1 = v5.begin();//v5的起始迭代器
while (it1 != v5.end())
{
//迭代器取*和指针意义一样,即为取指向位置的元素
cout << *it1 << endl;
it1++;
}
//vector常用的赋值操作
vector<int> v8;
//使用assign方法给v8赋值
v8.assign(v5.begin(), v5.end());
vector<int> v9;
v9 = v5;
int arr2[] = { 100, 200, 300 };
vector<int> v10(arr2, arr2 + sizeof(arr2) / sizeof(int));
//容器v10与容器v5元素进行交换
//两个数组只要元素类型相同,元素个数不相同仍是可以交换的,因为这是使他们对象中的指针指向的空间相互交换,并不是把指向空间的内容修改
v10.swap(v5);
vector<int>::iterator it2 = v10.begin();
it1 = v5.begin();
while (it1 != v5.end())//遍历容器v5
{
cout << *it1 << " ";
it1++;
}
cout << endl;
while (it2 != v10.end())
{
cout << *it2 << " ";
it2++;
}
cout << endl;
//大小操作
cout << "size:" << v5.size() << endl;//返回容器中元素个数,这儿v5元素由于和v10交换了,因此只有三个
if (v5.empty())//判断容器是否为空
{
cout << "为空" << endl;
}
else
{
cout << "不为空" << endl;
}
v5.resize(2);//变小时,强制把元素末尾的数据扔掉,只留前面的元素
v5.resize(5);//变大时,默认帮我们在容器后面加0
v5.resize(6, 1);//两个参数时,增大的空间用1去填充
it1 = v5.begin();
while (it1 != v5.end())
{
cout << *it1 << " ";
it1++;
}
cout << endl;
cout << v5.capacity() << endl;//容器容量,不是指已拥有的元素,而是指容器本身可以包含多少个元素,与v5.size()是两种概念
//存取数据
v5[3] = 400;//程序直接挂掉
v5.at(4) = 500;//抛异常
it1 = v5.begin();
while (it1 != v5.end())
{
cout << *it1 << " ";
it1++;
}
cout << endl;
cout << "front:" << v5.front() << endl;//返回容器第一个元素
cout << "back:" << v5.back() << endl;//返回容器最后一个元素
//插入和删除
vector<int> v11;
v11.push_back(10);
v11.push_back(20);
v11.insert(v11.begin(), 30);//头插法
v11.insert(v11.begin() + 2, 100);//vector支持随机访问,即可以任意访问容器的任意位置,insert函数第一个参数的位置,即为插入元素所在的位置,不是指从这个位置起,向后插入,而是这个位置即变为插入的元素,这个位置原本的元素向后推移
v11.insert(v11.end(), 40);//尾插法
v11.pop_back();//从元素末尾删除一个元素
v11.erase(v11.begin());//删除第一个元素,这时第二个元素变为容器的第一个元素了,这是因为v11.begin()指针指向了后一个元素,本质上这个区域的内存大小是不减少的
v11.erase(v11.begin(), v11.begin() + 1);
v11.clear();
cout << "size:" << v11.size() << endl;
//vector添加元素时,它会自动扩大内存,删除元素时,并不会自动减少内存
//巧用swap函数收缩vector空间
vector<int> v12;
for (int i = 0; i < 1000; i++)
{
v12.push_back(i);
}
cout << "size:" << v12.size() << endl;
cout << "capacity:" << v12.capacity() << endl;
v12.resize(10);
cout << "size:" << v12.size() << endl;
cout << "capacity:" << v12.capacity() << endl;
//下面一段代码十分巧妙的收缩了容器的空间,执行的步骤是先以v12为模板拷贝构造一个匿名对象,这个对象只有v12.size()的空间,并不是capacity的空间,再与v12进行内部指针交换指向空间,此时v12指向此匿名对象的空间,而这段代码执行完以后,匿名对象编会被系统回收,只留有容器v12,十分巧妙的收缩了容器的容量
vector<int>(v12).swap(v12);
cout << "size:" << v12.size() << endl;
cout << "capacity:" << v12.capacity() << endl;
//预留空间
v11.resize(100);//只是指已有元素的个数,与size对应
v11.reserve(1000);//这是为系统为容器指定内存空间时,一次性为容器分配多少空间,与capacity有关
//总结:当你知道容器大概要存储的元素个数时,你可以用reserve来指定系统一次为容器预留的空间
return 0;
}