vector基本概念
普通数组的区别
数组是静态空间,vector容器可以动态扩展,增加长度
动态扩展并不是在原空间之后续接新空间,而是找到比原来更大的内存空间,将原数据拷贝到新空间,释放原空间
vector容器的迭代器是支持随机访问的迭代器
vector构造函数
- vector<T> v ; //使用模板类,默认构造函数
- vector(v.begin(),v.end()); //将[v.begin(),v.end())区间中的元素拷贝给本身
- vector(n,elem); //将n个elem拷贝给本身
- vector(const vector &v) ; //拷贝构造函数
vector赋值
- vector& operator=(const vector &v); //重载赋值运算符
- assign(v.begin(),v.end()); //将[v.begin(),v.end())区间中的元素赋值给本身
- assign(n,elem); //将n个elem赋值给本身
vector容量和大小
- empty(); //判断容器是否为空,为空返回1,否则返回0
- capacity(); //返回容器的容量
- size(); //返回容器的大小,即容器中元素的个数
- resize(int num); //重新指定容器的长度为num,若容器变长,则以默认值0填充新位置,如果容器变短,则末尾超过容器长度的元素被删除
- resize(int num,int elem); //重新指定容器的长度为num,若容器变长,则以elem填充新位置,如果容器变短,则末尾超过容器长度的元素被删除
vector插入和删除
- push_back(ele); //尾部插入元素ele
- pop_back(); //删除最后一个元素
- insert(const_iterator pos,ele); //在迭代器指向的位置pos处插入一个元素ele
- insert(const_iterator pos,int count,ele); //在迭代器指向的位置pos处插入count个元素ele
- erase(const_iterator pos); //删除迭代器指向的元素
- erase(const_iterator begin,const_iterator end); //删除迭代器从begin到end之间的元素
- clear(); //删除容器中所有元素
vector数据存取
- at(int id); //返回索引id所指的数据
- operator[]; //返回[]内索引所指的数据
- front(); //返回容器中第一个元素
- back(); //返回容器中最后一个元素
vector互换容器
- swap(v); //容器v和当前容器互换
实际用于收缩内存
void test()
{
vector<int> v;
for (int i = 0; i < 100000; ++i)
{
v.push_back(i);
}
cout << "初始时:" << endl;
cout << "v的容量:" << v.capacity() << endl;
cout << "v的大小:" << v.size() << endl;
cout << "重新指定空间后:" << endl;
v.resize(10);
cout << "v的容量:" << v.capacity() << endl;
cout << "v的大小:" << v.size() << endl;
//用swap收缩内存
vector<int>(v).swap(v);
cout << "收缩内存后:" << endl;
cout << "v的容量:" << v.capacity() << endl;
cout << "v的大小:" << v.size() << endl;
}
vector预留空间
- reserve(int len); //容器预留len个元素长度,预留的位置并不初始化,同时也不可访问
功能:减少vector在动态扩容时的扩展次数
void test()
{
vector<int> v;
v.reserve(10000); //请尝试删除此行
int num = 0; //计算扩容次数
int* p = NULL;
for (int i = 0; i < 10000; ++i)
{
v.push_back(i);
if (p != &v.at(0))
{
p = &v[0];
num++;
}
}
cout << num << endl;
}