1.动态数组,可变数组,是一个连续的内存空间
2.vector容器,称为单口容器
3.实现动态增长:当插入新元素的时候,如果空间不足,那么vector会重新申请更大的一块内存空间,将原来空间数据拷贝到新空间,释放旧空间的数据,在把新元素插入新申请的空间里。
问:reserve和resize的区别?
答:reserve是容器预留的空间,但在空间内不是真正创建元素对象,所以在没有添加新的对象之前,不能引用容器内的元素。
resize是改变容器的大小,且在创建对象,因此,调用这个函数之后,就可以引用容器内的对象了。因此可以巧用reserve增加程序效率。
#include<iostream>
#include<vector>
using namespace std;
void printVector(vector<int> &v)
{
for (vector<int>::iterator iter = v.begin(); iter != v.end(); iter++)
{
cout << *iter << " ";
}
cout << endl;
}
//初始化
void test01()
{
vector<int> v; //默认构造
int arr[] = { 10,20,30,40 };
vector<int> v2(arr, arr + sizeof(arr) / sizeof(int));
vector<int> v3(v2.begin(), v2.end());
vector<int> v4(v3);
printVector(v4);
printVector(v3);
printVector(v2);
}
//vector常用复制操作
void test02()
{
int arr[] = { 10,20,30,40 };
vector<int> v1(arr, arr + sizeof(arr) / sizeof(int));
//成员方法
vector<int> v2;
v2.assign(v1.begin(), v1.end());
//重载=
vector<int> v3;
v3 = v2;
int arr2[] = { 101,202,303,404 };
vector<int> v4(arr2, arr2 + sizeof(arr2) / sizeof(int));
v4.swap(v1);
printVector(v1);
printVector(v2);
printVector(v3);
printVector(v4);
}
//大小操作
void test03()
{
int arr2[] = { 101,202,303,404 };
vector<int> v4(arr2, arr2 + sizeof(arr2) / sizeof(int));
cout << "size: " << v4.size() << endl;
if (v4.empty())
{
cout << "空";
}
else
cout << "不空" << endl;
v4.resize(2); //大小变小了之后会删除后面的元素
printVector(v4);
v4.resize(12); //大小变大了之后会有默认值
printVector(v4);
v4.resize(12,1); //大小变大了之后自定义值
printVector(v4);
for (int i = 0; i < 10000; i++)
{
v4.push_back(i);
}
cout << "size : " << v4.size() << endl; //元素的个数
cout << "容量 : " << v4.capacity() << endl; //容量
}
//存取数据
void test04()
{
int arr2[] = { 101,202,303,404 };
vector<int> v4(arr2, arr2 + sizeof(arr2) / sizeof(int));
for (int i = 0; i < v4.size(); i++)
{
cout << v4[i] << " ";
}
cout << endl;
for (int i = 0; i < v4.size(); i++)
{
cout << v4.at(i) << " ";
}
cout << endl;
//区别: at抛异常, []不会抛异常
cout << "front: " << v4.front() << endl; //第一个元素
cout << "back: " << v4.back() << endl;
}
//插入删除
void test05()
{
vector<int> v;
v.push_back(10);
v.push_back(20);
//头部插入
v.insert(v.begin(), 30);
//尾部插入
v.insert(v.end(), 40);
v.insert(v.begin() + 2, 100); //vector支持随机访问
//支持数组下标,一般支持随机访问
//迭代器也可以直接+2 +3 -2 -5 随机访问
printVector(v);
//删除
v.erase(v.begin());
printVector(v);
v.erase(v.begin()+1,v.end());
printVector(v);
v.clear(); //清空所有
cout << "sze :" << v.size() << endl;
}
void test06()
{
//vector里面增加元素会自动增长,但是删掉元素后不会自动缩减
//但是我们可以用swap收缩空间
vector<int> v;
for (int i = 0; i < 10000; i++)
v.push_back(i);
cout << "size: " << v.size() << endl;
cout << "capacity: " << v.capacity() << endl;
v.resize(10);
cout << "=====================" << endl;
cout << "size: " << v.size() << endl;
cout << "capacity: " << v.capacity() << endl;
//收缩空间
vector<int>(v).swap(v); //这里是匿名对象,匿名空间用完直接销毁了
cout << "=====================" << endl;
cout << "size: " << v.size() << endl;
cout << "capacity: " << v.capacity() << endl;
}
void test07()
{
//reserve和resize的区别
//reserve 预留空间
//resize
int num = 0;
int* address = NULL;
vector<int> v;
v.reserve(1000);
for (int i = 0; i < 100000; i++)
{
v.push_back(i);
if (address != &(v[0])) //观察拷贝的过程
{
address = &(v[0]);
num++;
}
}
cout << "num : " << num << endl;
//如果你先知道容器大概要存储的元素个数,那么你可以用reserve预留空间,
//这样就少了拷贝的过程
}
int main()
{
//test01();
test07();
system("pause");
return 0;
}