C++標準庫之vector和list

    在算法比賽中,想要使用數據結構來存放數據,雖然之前介紹了棧,隊列,鏈表等,但是在比賽中的有限時間中,我們不可能自己動手通過基本的數組,鏈表來組合或包裝來獲得自己需要的數據結構,所以掌握C++標準庫中已經封裝好的數據結構就顯然成爲一種不得不做的事。其實在之前介紹隊列和棧時,我的源代碼中就已經使用了標準庫中的stack和queue,那麼今天就介紹下標準庫中另外兩個基本的數據結構---vertor和list

1.vector

  其實vertor就是升級版的數組,升級在哪裏呢?數組在聲明時就已經確定了大小,例如int a[20]就規定了這個數組最多隻能存放20個元素,而vector的長度則是不固定的,通過一些方法可以自動的分配插入和刪除釋放一些內存空間,避免浪費內存和內存不夠用。vector的幾個基本方法如下:

函數名 功能 複雜度
size() 返回向量的元素數 O(1)
push_back(x) 在向量末尾添加元素x O(1)
 pop_back() 刪除向量的最後一個元素 O(1)
begin() 返回指向向量開頭的迭代器 O(1)
end() 返回指向向量末尾(最後一個元素的後一個位置) O(1)
insert(p,x) 在向量的位置p處插入元素x O(n)
erase(p) 刪除向量中位置p的元素 O(n)
clear() 刪除向量中所有元素 O(n)
由於vector中分配的內存和數組一樣是連續的,所以其插入insert和刪除erase的時間複雜度和數組一樣是O(n).同時vector可以像數組一樣通過[]訪問指定下標的元素。

上面只是介紹了算法比賽中常用的方法,想要深入的同學可以在C++在線API文檔之vector學習更多的方法.

以下是《挑戰》書中給出的Demo

#include<iostream>
#include<vector>
using namespace std;
void print(vector<double> V)
{
	for(int i=0;i<V.size();i++)
	{
		cout<<V[i]<<" ";
	}
	cout<<endl;
} 
int main()
{
	vector<double> V;
	
	V.push_back(0.1);
	V.push_back(0.2);
	V.push_back(0.3);
	V[2]=0.4;                       //V[x]的形式只能用來修改向量中已有的元素,不能用來添加元素 
	//V[3]=0.7;                     //此時V中元素最大小標爲2,想通過V[3]來添加元素,是不能成功的 
	print(V);                     //0.1 0.2 0.4
	
	V.insert(V.begin()+2,0.8);
	print(V);                      //0.1 0.2 0.8 0.4
	
	V.erase(V.begin()+1);            //0.1 0.8 0.4
	print(V);
	
	V.push_back(0.9);                 //0.1 0.8 0.4 0.9
	print(V);                         
	
	V.pop_back(); 
	print(V);                       //0.1 0.8 0.4 
	return 0;
}


2.list

list是STL中又一個重要的數據結構,不多廢話,下面是它的常用方法:

函數名 功能 複雜度
size() 返回表的元素數 O(1)
begin() 返回指向表開頭的迭代器 O(1)
end() 返回指向表末尾(最後一個元素的後一個位置) O(1)
push_front(x) 在表的開頭添加元素x O(1)
push_back(x) 在表的末尾添加元素x O(1)
pop_front() 刪除位於表開頭的元素 O(1)
pop_back() 刪除位於表末尾的元素 O(1)
insert(p,x) 在表的位置p插入元素x O(1)
erase(p) 刪除表中位置p的元素 O(1)
clear() 刪除表中所有元素 O(n)
和vector一樣,想詳細瞭解list的可以訪問C++在線API文檔之list

其實list有點像鏈表,所以其插入insert和刪除erase的時間複雜度都是O(1)。要注意list不能像vector一樣使用[]通過下標訪問指定的元素,只能通過迭代器iterator來遍歷再訪問,以下是包含迭代器的list的一個Demo.

#include<iostream>
#include<list>
using namespace std;
void print(list<char> L)
{
	int i=0;
	for(list<char>::iterator it=L.begin();it!=L.end();it++)
	{
		if(i++) cout<<" ";
		cout<<*it;
	}
	cout<<endl;
} 
int main()
{
	list<char> L;
	
	L.push_front('b');     //[b]
	L.push_back('c');      //[bc]
	L.push_front('a');     //[abc]
	print(L);
	
	cout<<L.front()<<endl;        //a
	cout<<L.back()<<endl;          //c
	
	L.pop_front();           //[bc]
	L.push_back('d');         //[bcd]
	print(L);
	
	cout<<L.front()<<endl;           //b
	cout<<L.back()<<endl;      //d
	
	return 0;
}

vetor和list就簡單介紹到這,只是最基本的用法,但是我感覺這在算法比賽已經完全夠用了~實在不夠就再學唄

PS:大年初一,聽着外面的鞭炮聲擼代碼,寫博客的感覺也是挺爽的~在這裏祝大家新年快樂~


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