一、概念
- vector容器的数据结构和数组十分相似,又称为单端数组
- 但数组是静态空间,而vector是动态拓展
- 动态拓展指并不是在原空间上接续空间,而是换一个更大的合适的内存空间,然后将原数据拷贝进该空间,释放旧空间
- vector容器的迭代器是支持随机访问的迭代器
二、vector构造函数
#include<iostream>
using namespace std;
#include<vector>
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;//默认构造 无参构造
for(int i=0;i<10;i++)
{
v1.push_back(i);
}
printVector(v1);
//通过区间方式构造
vector<int>v2(v1.begin(),v1.end());
printVector(v2);
//n个elem构造
vector<int>v3(10,1);
printVector(v3);
//拷贝构造
vector<int>v4(v3);
printVector(v4);
}
int main()
{
test01();
return 0;
}
结果:
三、vector赋值操作
#include<iostream>
using namespace std;
#include<vector>
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;
for(int i=0;i<10;i++)
{
v1.push_back(i);
}
printVector(v1);
//直接赋值
vector<int>v2;
v2=v1;
printVector(v2);
//assign
vector<int>v3;
v3.assign(v1.begin(),v1.end());
printVector(v3);
//assign n个elem
vector<int>v4;
v4.assign(10,1);
printVector(v4);
}
int main()
{
test01();
return 0;
}
结果:
四、vector容量和大小
/*empty(); 判断是否为空 为空返回1否则返回0
capacity(); 容器的容量
size(); 容器中元素的个数
resize(int num); 重新指定容器的容量 若变长以默认值0填充 若变短超出容器容量的元素被删除
resize(int num,int elem); 重新指定容器的容量 若变长以elem的值填充 若变短超出容器容量的元素被删除*/
#include<iostream>
using namespace std;
#include<vector>
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;
for(int i=0;i<10;i++)
{
v1.push_back(i);
}
printVector(v1);
if(v1.empty())
cout<<"v1为空"<<endl;
else
cout<<"v1不为空"<<endl;
cout<<"v1的容量为:"<<v1.capacity()<<endl;
cout<<"v1的大小为:"<<v1.size()<<endl;
v1.resize(15);
printVector(v1);
cout<<"v1的容量为:"<<v1.capacity()<<endl;
cout<<"v1的大小为:"<<v1.size()<<endl;
v1.resize(5);
printVector(v1);
cout<<"v1的容量为:"<<v1.capacity()<<endl;
cout<<"v1的大小为:"<<v1.size()<<endl;
v1.resize(15,10);
printVector(v1);
cout<<"v1的容量为:"<<v1.capacity()<<endl;
cout<<"v1的大小为:"<<v1.size()<<endl;
}
int main()
{
test01();
return 0;
}
结果:
五、vector插入和删除
#include<iostream>
using namespace std;
#include<vector>
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;
for(int i=0;i<6;i++)
{
//尾插 push_back(ele);
v1.push_back(i);
}
printVector(v1);
//尾删 pop_back();
v1.pop_back();
printVector(v1);
//迭代器指向位置插入元素 insert(const_iterator pos, ele);
v1.insert(v1.begin()+1,6);
printVector(v1);
//迭代器指向位置插入count个元素 insert(const_iterator pos, int count,ele);
v1.insert(v1.begin()+1,2,5);
printVector(v1);
//erase(const_iterator pos); 删除迭代器指向的元素
v1.erase(v1.begin());
printVector(v1);
//erase(const_iterator start, const_iterator end); 删除迭代器从start到end之间的元素
v1.erase(v1.begin()+2,v1.begin()+4);//左闭右开
printVector(v1);
//clear(); 删除容器中所有元素
v1.clear();
cout<<"v1的容量为:"<<v1.capacity()<<endl;
cout<<"v1的大小为:"<<v1.size()<<endl;
}
int main()
{
test01();
return 0;
}
结果:
六、vector数据存取
#include<iostream>
using namespace std;
#include<vector>
int main(){
int i;
vector<int>v1;
for(i=0;i<10;i++){
v1.push_back(i);
}
for(i=0;i<v1.size();i++){
cout<<v1[i]<<" ";
}
cout<<endl;
for(i=0;i<v1.size();i++){
cout<<v1.at(i)<<" ";
}
cout<<endl;
cout<<"最前面的数:"<<v1.front()<<endl;
cout<<"最后面的数:"<<v1.back()<<endl;
return 0;
}
结果:
七、vector互换容器
#include<iostream>
using namespace std;
#include<vector>
void printvector(vector<int>&v){
for(vector<int>::iterator it=v.begin();it!=v.end();it++){
cout<<*it<<" ";
}
cout<<endl;
/*int i;
for(i=0;i<v.size();i++){
cout<<v[i]<<" ";
}
cout<<endl;*/
}
void test01(){
vector<int>v1,v2;
int i;
for(i=0;i<10;i++){
v1.push_back(i);
}
for(i=9;i>=0;i--){
v2.push_back(i);
}
printvector(v1);
printvector(v2);
v1.swap(v2);
cout<<"互换后:"<<endl;
printvector(v1);
printvector(v2);
}
//用途 收缩内存
void test02(){
vector<int>v;
int i;
for(i=0;i<10000;i++){
v.push_back(i);
}
cout<<"v的容量为:"<<v.capacity()<<endl;
cout<<"v的大小为:"<<v.size()<<endl;
v.resize(3);
cout<<"v的容量为:"<<v.capacity()<<endl;
cout<<"v的大小为:"<<v.size()<<endl;
vector<int>(v).swap(v);//匿名对象 匿名容器将v的数据拷贝后进行交换 匿名对象在使用完后空间会自动立即释放
cout<<"v的容量为:"<<v.capacity()<<endl;
cout<<"v的大小为:"<<v.size()<<endl;
}
int main(){
test01();
test02();
return 0;
}
结果:
八、vector预留空间
#include<iostream>
using namespace std;
#include<vector>
void test01(){
vector<int>v;
int i,sum=0;
int *p=NULL;
for(i=0;i<10000;i++){
v.push_back(i);
if(p!=&v[0]){//每次动态分配内存是直接换一个容器
p=&v[0];
sum++;//为容器动态分配内存的次数
}
}
cout<<"预留空间前:sum="<<sum<<endl;
}
void test02(){
vector<int>v;
int i,sum=0;
int *p=NULL;
v.reserve(10000);
for(i=0;i<10000;i++){
v.push_back(i);
if(p!=&v[0]){//每次动态分配内存是直接换一个容器
p=&v[0];
sum++;//为容器动态分配内存的次数
}
}
cout<<"预留空间后:sum="<<sum<<endl;
}
int main(){
test01();
test02();
return 0;
}
结果: