STL -- vector容器

1概念

  • 动态数组
    在这里插入图片描述
  • vector 的实质配置空间大小比客户需求要大,一旦容量等于大小 便是满载 下次在有新增就得另寻他所。
  • 注意:
    • 所谓的动态增加并不是在原有的空间上续接新的空间而是申请一个更大的空间,然后将数据考过去。并释放原空间因此对vector的任何操作 一旦引起空间的重置 指向原vector的所有的迭代器就失效了

2常用函数

2.1构造函数

在这里插入图片描述

2.2vector常用赋值操作

在这里插入图片描述

2.3大小操作

在这里插入图片描述

2.4数据存储操作

在这里插入图片描述

2.5 插入删除操作

在这里插入图片描述

2.6实例

#include<iostream>
#include<vector>
using namespace std;
void test01(){
	vector<int> v;
	for(int i=0;i<10;i++){
		//v[i]=i;//段错误 此种符值只能用在 开辟好空间以后 才可以使用
		v.push_back(i);
		cout<<v.capacity()<<endl;//不是两倍的机制
	}

}
void Printf(vector<int>& v){
	for(vector<int>::iterator it=v.begin();it!=v.end();it++){
		cout<<*it<<" ";
	}
	cout<<endl;
}
int test02(){
	//构造
	vector<int> v1;
	vector<int> v2(10,100);
	Printf(v2);
	vector<int> v3(v2.begin(),v2.end());
	Printf(v3);
	//赋值
	vector<int> v4;
	v4.assign(v3.begin(),v3.end());
	v4=v3;
	Printf(v4);

	int arr[]={1,2,4,4,5};
	vector<int> v5(arr,arr+5);

	v4.swap(v5);
	Printf(v4);
}

int test03(){
	vector<int> v1;
	v1.push_back(10);
	v1.push_back(10);
	v1.push_back(10);
	v1.push_back(10);
	if(v1.empty()){

		cout<<v1.size()<<endl;
	}
	//重新指定长度
	v1.resize(3);
	//如果比原来长了 默认用0填充 可以用第2个参数代替默认值
	//如果比原来短了 超出的元素部分就被删除掉了
	//reserve 预留空间 但是不初始化 元素不可访问
	Printf(v1);
	v1.insert(v1.begin(),1000);
	v1.insert(v1.begin(),2,2000);	
	Printf(v1);
		
	cout<<v1.front()<<"   "<<v1.back()<<endl;
	//删除
	v1.pop_back();
	v1.erase(v1.begin());
	v1.clear();
	Printf(v1);
}

3技巧

3.1巧用swap来收缩内存

void test04(){
	vector<int> v;
	for(int i=0;i<10000;i++){
		v.push_back(i);
	}
	cout<<v.capacity()<<endl;

	cout<<v.size()<<endl;
	v.resize(3);
	cout<<"v.resize(3)"<<endl;
	cout<<v.capacity()<<endl;
	cout<<v.size()<<endl;

	cout<<" 收缩容器"<<endl;
	//收缩容器
	//vector<int>(v),定义一个匿名对象 并用v来初始化 初始化是用v的size来初始化大小
	//swap(v); 交换是双向的。 将v指向的空间和匿名对象指向的空间互换
	vector<int>(v).swap(v);
	cout<<v.capacity()<<endl;
	cout<<v.size()<<endl;

}

3.2巧用reserve来预留空间

void test05(){
	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[0]){
			p=&v[0];
			num++;//开辟新空间的次数//没加reverse之前 num=1;
		}
	}
	cout<<"num:"<<num<<endl;
}
//逆序遍历
int void6(){
	vector<int> v1;
	v1.push_back(10);
	v1.push_back(20);
	v1.push_back(30);
	v1.push_back(40);
	cout<<"逆序"<<endl;
	for(vector<int>::reverse_iterator it=v1.rbegin();it!=v1.rend();it++){
		cout<<*it<<" ";
	}
	cout<<endl;


}

3.3如何验证迭代器可以重载

int void7(){
	//vector的迭代器支持随机访问 但是list不支持
	//判断方式
	vector<int> v1;
	v1.push_back(10);
	v1.push_back(20);
	v1.push_back(30);
	v1.push_back(40);

	vector<int>::iterator it=v1.begin();
	it=it+2;


}
int main(){
	test01();

}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章