vector是非常类似array的容器,其更高级的一点是其容量可以根据实时需求动态调整。本文在array容器相关方法的基础上进一步探索vector容器的动态性。
vector
Dedinition
- 类似array容器
- 但是容量可以根据实际需求增加
[reserve()方法]
或者减少[shrink_to_fit()或者swap()方法]
- 其元素也可随机插入
[insert()]
或者删除[erase()]
定义、初始化、随机访问
#include<iostream>
#include<vector>
using namespace std;
int main(){
vector<char>value;
//插入方法1————尾部插入
value.push_back('S');
value.push_back('T');
value.push_back('L');
printf("元素个数为:%d",value.size());
//也可利用pop_back()删除末尾元素
//auto遍历
for(auto i = value.begin();i<value.end();i++)
cout<<*i<<" ";
//插入方法2————随机插入
value.insert(value.begin(),'C');
cout<<"首个元素为:"<<value.at(0)<<endl;
//也可以用erase()方法随机删除元素
//可用clear()方法删除所有元素
return 0;
}
连续访问(遍历)
#include<iostream> //输入输出
#include<vector> //引入vector容器,以使用内部模板类
using namespace std;
int main(){
vector<int> a{1,2,3,4,5,6,7,8,9};
cout<<"第一种方法——下标访问"<<endl;
for(int i = 0;i<a.size();i++)
cout<< a[i] <<" ";
vector<int>::iterator i; //可以用auto作为迭代器i的类型
cout<<endl<<"第二种方法——随机迭代器顺序访问(采用<v.end())"<<endl;
for(i = a.begin();i < a.end();i++)
cout<< *i <<" ";
cout<<endl<<"第三种方法——随机迭代器顺序访问(采用!=v.end())"<<endl;
for(i = a.begin();i != a.end();i++)
cout<< *i <<" ";
cout<<endl<<"第四种方法——随机迭代器顺序访问(采用while循环)"<<endl;
i = a.begin();
while(i<a.end()){
cout<< *i <<" ";
i+=2;
}
//逆序迭代
auto first1 = a.rbegin();
auto end1 = a.rend();
while(first1!=end1){
cout<<endl<<*first1<<" ";
first1++;
}
return 0;
}
容量的动态调整
容量VS.大小
- 容量
capacity()
,☞容器申请的内存空间 - 大小
size()
,☞容器占用的内存空间 - 如果
myvector.capacity()==myvector.size()
,再向myvector
中存储元素时,myvector
容器会自动扩容。
#include<iostream>
#include<vector>
using namespace std;
int main(){
//vector自动增加容量;。
vector<int> values;
cout<<"大小:"<<values.size()<<" "<<"容量:" <<values.capacity()<<endl;//0 0
for(int i=0;i<10;i++) values.push_back(i);
cout<<"大小:"<<values.size()<<" "<<"容量:" <<values.capacity()<<endl;//10 16
//指数式增加容量;
values.shrink_to_fit();//shrink_to_fit()容量缩小到和大小相等。
cout<<"大小:"<<values.size()<<" "<<"容量:" <<values.capacity()<<endl;// 10 10
values.clear();
cout<<"大小:"<<values.size()<<" "<<"容量:" <<values.capacity()<<endl;// 0 10
//swap()方法同样具有shrink_to_fit()的功能
vector<int>(values).swap(values);
cout<<"大小:"<<values.size()<<" "<<"容量:" <<values.capacity()<<endl;// 0 0
values.shrink_to_fit();
cout<<"大小:"<<values.size()<<" "<<"容量:" <<values.capacity()<<endl;// 0 0
return 0;
}
利用reserve()方法申请(增加)容量
- vector容器扩容的三个步骤
- 重新选择一处内存地址, 开辟一块内存空间
- 将原来myvector容器中的元素复制到新的地址空间中
- 析构掉原来myvector容器中的元素,并回收myvector容器的地址空间
因此,扩容后的容器将丢失容器迭代器等工具,需重新定义。
另一方面,扩容是一个非常耗时的过程,因此要尽量避免扩容,一次性申请足够的空间。