1. 程式人生 > >STL-線性容器-vector

STL-線性容器-vector

#include"iostream"
#include<stdlib.h>  
#include<time.h>  
#include"vector"
using namespace std;


/*順序容器
vector      可變大小陣列,支援快速隨機訪問
deque       雙端佇列,支援快速隨機訪問
list		雙向連結串列,雙向順序訪問
forward_list  單項鍊表,單項順序訪問
arrey    固定大小陣列
string	與vector相似的容器,儲存字串,隨機訪問

類型別名:必須顯示的使用型別名(作用域)
		eg list<string>::iterator iter; vector<int>:reference a = b;
		iterator const_iterator
		size_type 無符號整形,儲存容器大小類資料
		difference_type  帶符號整形,儲存兩個迭代器之間的距離
		value_type 元素型別
		reference元素的左值型別 value_type&含義相同
		const_reference

初始化:C c; C c(c2); C c(b,e)迭代器b和e之間。C c{a,c,c,e,e...}初始化列表,新標準支援
賦值與交換
		c1 = c2;c1 = {a,x,c,d,e} c1中的元素替換

		assign()除了arrey其他順序容器均可
		從不同但相容的型別賦值,或者拷貝子序列
		v.assign(v2.begin(),v2.end())
		v.assign(v3.begin(),10,"Hellow")//10個Hellow初始化賦值

		a.swap(b);	swap(a,b)//儘量使用非成員版的//別的容器交換是迭代器交換,arrey則是值交換


vetor
.push_back() pop_back()   vector
.front() .back() v.empty() 


大小
c.size() (不支援forward_list) c.max_size()c可以儲存的最大數目
c.insert() c.erase() c.clear()刪除c中所有元素,返回void
> = < >= <=

迭代器
begin end 迭代器(尾後迭代器,左閉右開)cbegin cend 返回const_iterator型別
c.rbegin() c.rend()逆序迭代器(不支援forward_list) c.crbegin() c.crend()
*/



int randNum()
{
	//    int flags[11];//標誌位  
	int i = 0;
	int Y = 30;
	int X = 10;
	int temp;
	//驗證確實生成了[20,30]的隨機數  
	temp = rand() % (Y - X + 1) + X;//生成[10,30]的隨機數  
	return temp;
}


//頭元素尾元素的讀取修改和刪除
void getElement()
{
	vector<int>v1;
	for (int i = 0; i < 5; i++)
	{
		v1.push_back(randNum());//從尾部插入v1.push_back() 自動擴充大小不用提前分貝記憶體
	}
	cout << v1.front() << endl;//獲取頭部元素 v1.front()
	v1.front() = 11;   //v1.front()當左值 修改頭部元素
	v1.back() = 22;    //v1.back()當左值 修改尾部元素

	while (v1.size() > 0)
	{
		cout << v1.back();//取出尾部元素 v1.back()
		v1.pop_back();//刪除尾部元素(彈出)v1.pop()
		cout << "    vector長度:" << v1.size()<<endl;
		cout << "vector_maxsize:" << v1.max_size() << endl;
	}
    
}


//初始化
void InitialVector()
{
	vector<int>v1;
	for (int i = 0; i < 5; i++)
	{
		v1.push_back(randNum());
	}
	vector<int>v2 = v1;
	vector<int>v3(v1.begin(),v1.end()-2);
	vector<int>v4(10, 0);//10個0
	vector<string>v5;
	v5.assign(10, "hehehe ");
	for (int i = 0; i < v3.size(); i++)
	{
		cout << v3[i] << endl;
	}

}


//遍歷
void VectorTraverse()
{
	vector<int> v(10);//提前分配記憶體大小 =進行拷貝
	for (int i = 0; i < 10; i++)
	{
		v[i] = randNum();//實際是拷貝,所以得提前分配記憶體
	}
	for (int i = 0; i < 10; i++)
	{
		cout << v[i] << " ";
	}
	cout << endl;
	//關於迭代器
	//end在最後一個元素的下一個位置   迭代器的種類 
	//任何使用迭代器的迴圈體,都不要向容器中新增元素,否則迭代器失效
	//迭代器方式正向遍歷
	for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
	{
		cout << *it<<' ';//*t解引用
	}
	for (auto it = v.cbegin(); it != v.cend(); it++)//const_iterator
	{
		cout << *it << ' ';
	}
	cout << endl;
	//迭代器方式反向遍歷
	for (vector<int>::reverse_iterator rit = v.rbegin(); rit != v.rend(); rit++)
	{
		cout << *rit<<' ';
	}
	cout << endl;
}  


void PrintVector(vector<int>&v)
{
	for (int i = 0; i < v.size(); i++)
	{
		cout << v[i] << ' ';
	}
	cout << endl;
}

//插入和刪除
void insertAnddelte()
{
	vector<int>v(10);
	for (int i = 0; i < 10; i++)
	{
		v[i] = randNum();//實際是拷貝,所以得提前分配記憶體
	}
	v.erase(v.begin(), v.end() - 8);//刪除指定的區間
	PrintVector(v);
	v.erase(v.begin());//刪除指定位置的元素
	PrintVector(v);
	v[1] = 2;
	v[4] = 2;
	v[6] = 2;
	PrintVector(v);
	for (vector<int>::iterator it = v.begin(); it != v.end();)
	{
		if (*it == 2)
		{
			it = v.erase(it);//eraser刪除之後,將迭代器自動向後移一位
		}
		else
			it++;
	}
	PrintVector(v);
	//頭插和尾插
	v.insert(v.begin(), 100);
	v.insert(v.end(), 100);
	PrintVector(v);
}

void main03()
{
	//初始化一次就行,否則每次執行時間過短導致產生一模一樣的隨機數
	srand(time(0));
    getElement();
	InitialVector();
	VectorTraverse();
	insertAnddelte();
	system("pause");
}