概念
- 动态数组,可变数组
- 是一个单口容器,尾部插入删除的效率更高,从其他位置插入删除会引起其他元素的移动,从而效率低下
- pushback()方法尾部插入
- 提供pop_back(),尾部删除
- 用.begin()和.end()标识结尾和开头,end不是元素位置
动态增长基本原理
- 申请一块更长的内存空间
- 把原有元素拷贝到新的内存空间
- 把增长的元素拷贝到新空间
- 指针指向新的空间,释放旧的空间
vector构造函数
vector<T> v;
vector(v.begin(),v.end());
vector(n,elem);
vector(const vector &vec);
int arr[]={2,3,4,1,9};
vector<int> v1(arr,arr+sizeof(arr)/sizeof(int));
vector常用赋值操作
assign(beg,end);
assign(n,elem);
vector& operator=(const vector &vec);
swap(vec);
int arr[]={0,1,2,3,4};
assign(arr,arr+5);
vector大小操作
size();
empty();
resize(int num);
resize(int num,elem);
capacity();
reserve(int len);
vector数据存取操作
at(int idx);
operator[idx];
front();
back();
vector插入和删除操作
insert(const_iterator pos,int count,ele);
push_back(ele);
pop_back();
erase(const_iterator start,const_iterator end);
erase(const_iterator pos);
clear();
巧用swap缩减空间
- swap()自身交换指针,然后初始化,释放多余空间,达到缩减空间的目的
vector<int> (v).swap(v);
cout << "-----------" << endl;
cout << "size:" << v.size() << endl;
cout << "capacity:" << v.capacity() << endl;
reserve预留空间提高程序效率
- 知道大概存储数据才预留空间
- 拷贝和重新申请内存都相对耗时间
代码示例
#include<iostream>
#include<string>
#include<vector>
using namespace std;
void PrintVector(vector<int>& v)
{
for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
{
cout << *it << " ";
}
cout << endl;
}
void test01()
{
vector<int> v1;
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(v1);
PrintVector(v2);
PrintVector(v3);
PrintVector(v4);
}
void test02()
{
int arr[] = { 10,20,30,40 };
vector<int> v1;
vector<int> v2(arr, arr + sizeof(arr) / sizeof(int));
v1.assign(v2.begin(), v2.end());
vector<int> v3;
v3 = v1;
int arr1[] = { 100,200,300,400 };
vector<int> v4(arr1, arr1 + sizeof(arr1) / sizeof(int));
cout << "-----------" << endl;
PrintVector(v1);
PrintVector(v2);
PrintVector(v3);
PrintVector(v4);
cout << "-----------" << endl;
v4.swap(v1);
PrintVector(v1);
PrintVector(v2);
PrintVector(v3);
PrintVector(v4);
}
void test03()
{
int arr[] = { 100,200,300,400 };
vector<int> v1(arr, arr + sizeof(arr) / sizeof(int));
cout << "size: " << v1.size() << endl;
if (v1.empty()==true)
{
cout << "空!" << endl;
}
else
{
cout << "不空!" << endl;
}
PrintVector(v1);
v1.resize(2);
PrintVector(v1);
v1.resize(4);
PrintVector(v1);
v1.resize(6, 1);
PrintVector(v1);
v1.reserve(10);
PrintVector(v1);
cout << v1.capacity() << endl;
cout << v1.size() << endl;
}
void test04()
{
int arr[] = { 100,200,300,400 };
vector<int> v1(arr, arr + sizeof(arr) / sizeof(int));
for (int i=0;i<v1.size();i++)
{
cout << v1.at(i) << " ";
}
cout << endl;
cout << "front:" << v1.front() << endl;
cout << "back:" << v1.back() << endl;
}
void test05()
{
vector<int> v1;
v1.push_back(10);
v1.push_back(20);
v1.insert(v1.begin(), 30);
v1.insert(v1.end(), 40);
v1.insert(v1.begin()+2, 100);
PrintVector(v1);
v1.erase(v1.begin());
PrintVector(v1);
v1.clear();
cout << v1.size() << endl;
PrintVector(v1);
}
void test06()
{
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()
{
int num = 0;
int* address = NULL;
vector<int> v1;
v1.reserve(100000);
for (int i = 0; i < 100000; i++)
{
v1.push_back(i);
if (address != &(v1[0]))
{
address = &(v1[0]);
num++;
}
}
cout << num << endl;
cout << "capacity:" << v1.capacity() << endl;
}
int main(void)
{
test07();
return 0;
}