在算法比賽中,想要使用數據結構來存放數據,雖然之前介紹了棧,隊列,鏈表等,但是在比賽中的有限時間中,我們不可能自己動手通過基本的數組,鏈表來組合或包裝來獲得自己需要的數據結構,所以掌握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) |
上面只是介紹了算法比賽中常用的方法,想要深入的同學可以在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) |
其實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:大年初一,聽着外面的鞭炮聲擼代碼,寫博客的感覺也是挺爽的~在這裏祝大家新年快樂~