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();

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