【PAT笔记】C++标准模板库STL(一)——vector的用法和示例
1.vector的常見用法
vector翻譯為向量,但是用“長短根據需要而自動改變的數組”更容易記憶。如果要使用vector,則需要用到頭文件#include <vector>,另外還需要using namespace std; 才可以使用。
PAT中的相關題目有(代碼見下方):
1039 Course List for Student (25 分)
1047 Student List for Course (25 分)
1.1 vector的定義:vector<typename> name
例如:vector<int> name? ?vector<double> name等
引申:由此容易聯想到二維數組的定義,初學者可以把二維vector數組當做兩個維都可以變長的二維數組來理解更方便。因為vector<double> name本身就是一個數組,那么vector的二維數組就變成了vector<typename> Arrayname[arraySize]。這樣ArraySize[0]~ArraySize[arraySize-1]中每一個都是一個vector容器。vector二維數組使用是這樣的:Arrayname[x][y]。
1.2 vector容器內元素的訪問
(1)下標法訪問:如vector<int> vi,訪問vi[index]即可(如vi[1],vi[2]),但是這樣的缺點也很明顯,即訪問除了0~vi.size()-1以外的元素會出錯,失誤了vector容器的靈活性。
(2)通過迭代器訪問:迭代器(iterator),其定義是vector<typename>::iterator it; 如(vector<int>::iterator it=vi.begin();),從括號里的例子可以看出,這里的vi[i]和*(vi.begin()+i)是等價的。另外值得注意的一點是,與begin()正好代表第1個(數組中標記為0),end()并不是取偽元素,而是取尾元素的下一個地址,這是不同的。
1.3 vector的函數
(1)push_back():顧名思義,push_back(x)就是在vector后面添加一個元素x,示例:
for(int i=0;i<=3;i++){vi.push_back(i); //將0 1 2 3 依次插入vi的末尾,可以輸出0123 }(2)pop_back():用來刪除vector的尾元素,示例:
for(int i=0;i<=3;i++){vi.push_back(i); //將0 1 2 3 依次插入vi的末尾,可以輸出0123 } vi.pop_back(); //刪除了3(3)size():用來獲取vector的元素,示例:
vi.size(); //獲得vector容器元素的個數(4)clear():用來清除vector中的所有元素,示例:
vi.clear(); //清除vector容器的所有元素(5)insert():insert(it,x);就是在任意迭代器it處插入一個元素x,示例:
for(int i=0;i<=3;i++){vi.push_back(i); //將0 1 2 3 依次插入vi的末尾,可以輸出0123 } vi.insert(vi.begin()+2,-1); //0 1 -1 2 3(6)erase():刪除單個元素或者刪除一個區間內的所有元素,示例:
for(int i=0;i<=3;i++){vi.push_back(i); //將0 1 2 3 依次插入vi的末尾,可以輸出0123 } vi.erase(vi.begin()+2); //刪除位置在2號為的元素 vi.erase(vi.begin()+1,vi.begin()+3);//刪除位置在1~2號位的所有元素?現在附上兩道PAT的代碼:
A1039 需要用到的是vector的二維數組存儲方式和表達方式:
#include <stdio.h> #include <algorithm> #include <vector> #include <string.h> #include <iostream> using namespace std;const int N=40010; //總人數 const int M=26*26*26*10+10; //名字的上限 vector<int> selectCourse[M]; //每個學生選擇的課程編號 int getID(char a[]){int id=0;for(int i=0;i<3;i++){id=id*26+(a[i]-'A'); //我曾在這里犯了錯誤,誤以為id*10的,導致段錯誤,也就是數組溢出了 }id=id*10+(a[3]-'0');return id; } int main(){char name[5];int m,n;scanf("%d%d",&n,&m);for(int i=0;i<m;i++){int course,x;scanf("%d%d",&course,&x);for(int j=0;j<x;j++){scanf("%s",name);int id=getID(name);selectCourse[id].push_back(course); //這里就是vector的二維數組構成現場,將此事id這個學生選的課記錄在后面,selectCourse本身也是數組 } //可以認為selectCourse縱向分布,course在其后面橫向分布 }for(int i=0;i<n;i++){scanf("%s",name);int id=getID(name);sort(selectCourse[id].begin(),selectCourse[id].end());printf("%s %d",name,selectCourse[id].size());for(int j=0;j<selectCourse[id].size();j++){printf(" %d",selectCourse[id][j]); //vector二維數組的輸出,就是輸出每個學生之后選的課 }printf("\n");}return 0; }A1047 也是考察vector二維數組(注意二者的不同):
#include <stdio.h> #include <algorithm> #include <string.h> #include <vector> #include <iostream> using namespace std; const int N=40010; const int M=2510; // 我在這里也犯了溢出錯誤,給數組的空間不夠 char name[N][5]; vector<int> course[M];bool cmp(int a,int b){return strcmp(name[a],name[b])<0; }int main(){int n,m,x,courseID;scanf("%d%d",&n,&m);for(int i=0;i<n;i++){scanf("%s%d",name[i],&x);for(int j=0;j<x;j++){scanf("%d",&courseID); course[courseID].push_back(i); //和A1039類似,這里也是存儲的vector二維數組,但是這里反過來,以課程為縱軸,學生為橫軸 } //都是數字,課程編號和名字位置編號 }for(int i=1;i<=m;i++){printf("%d %d\n",i,course[i].size());sort(course[i].begin(),course[i].end(),cmp);for(int j=0;j<course[i].size();j++){printf("%s\n",name[course[i][j]]); //通過課程編號和名字位置編號,可以得出名字 } }return 0; }?
總結
以上是生活随笔為你收集整理的【PAT笔记】C++标准模板库STL(一)——vector的用法和示例的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【PAT笔记】PAT中的散列思想
- 下一篇: 【PAT笔记】C++标准模板库STL(二