本單元重點回顧
容器=裝很多同型態元素的整理櫃:附帶現成操作,來自 C++ 標準函式庫;本單元的主角是容器 vector、string,加上常搭配的工具型態 pair。O(\cdot) 記號標運算量的成長形狀(O(1) 一步到位、O(n) 掃一遍、O(n \log n) 略慢於掃一遍、O(n^2) 兩兩都比);估 TLE 三步驟:認 O →代最大 n →除以 10^9 跟時限比。
vector 是長度可變的陣列:
vector<int> v(n, x);大小可以用變數、初始值省略補 0;元素住連續記憶體、索引 O(1) 取用、增刪只有尾端快。成員函式用點呼叫:
v.push_back(x)、v.pop_back()、v.back()、v.size()、v.empty()、v.resize(n)——都是變數.函式(參數)的形式;reserve、capacity這些名字像的別亂用。vector 的陣列與巢狀 vector 收納多條數列:每條各自伸縮,記憶體大約只花實際元素總數(每條另有少量管理成本);條數上限已知用
vector<int> a[MAX_N];,條數執行時才知道用vector<vector<int>>——g[i][j]讀法同二維陣列。size()回傳無號整數:空容器的size() - 1環繞成天文數字,是經典炸彈——size()一到手就存進int(競賽題的資料量上限都放得進int,這樣轉才安全)。所有容器(含 string)都適用這條。iterator 是「容器裡的位置」:
begin()指第一個元素、end()指最後一個的下一格(含頭不含尾);*it取值、v.begin() + i是索引 i 處。insert/erase靠它指位置,但都是 O(n)——大量使用前先想想。vector 能
=複製、能比較:複製是完整複製(O(n));==、<按 8.9 的字典序。複製與比較這些內建陣列做不到的操作,vector 直接支援;大 vector 進函式記得掛&傳參考,避免整包複製。string 讓字串處理脫胎換骨:不用管
'\0'、不用猜大小;s.size()、s[i]、=、==、+全部直接用;cin >> s讀單詞的規則不變。string 解題三寶:
substr(pos, len)取子字串、find搜尋(跟string::npos比)、字典序比較一個符號。累加字串一律+=——ans = ans + s放迴圈是 n^2 的 TLE 炸彈;兩個字面常數不能相加也不能比較。數字與字串互轉:
stoi(超出 int 範圍會 RE,大數用stoll)、to_string;位數相關的題目「把數字當字串處理」常常更好寫——單一字元用s[i] - '0'、整串用stoi。整行輸入:
getline(cin, s)讀一整行;前面有cin >>記得cin.ignore()清殘留換行;「每行數量不定」交給 stringstream——把一行變成迷你輸入流,ss >> x用法同cin。
pair 綁兩個值:
p.first、p.second;比較規則「先比 first、平手比 second」。vector<pair<int, int>>是競程日常。(延伸)array 是披上容器外衣的陣列:
array<int, 3>,大小是型態的一部分;它可以整個複製、指派,所以能當 vector 的元素——普通陣列不行。