語法書 / AA 競程語法書 下冊 / 第十單元 / 本單元重點回顧

本單元重點回顧

  1. 容器=裝很多同型態元素的整理櫃:附帶現成操作,來自 C++ 標準函式庫;本單元的主角是容器 vector、string,加上常搭配的工具型態 pair。O(\cdot) 記號標運算量的成長形狀(O(1) 一步到位、O(n) 掃一遍、O(n \log n) 略慢於掃一遍、O(n^2) 兩兩都比);估 TLE 三步驟:認 O →代最大 n →除以 10^9 跟時限比。

  2. vector 是長度可變的陣列vector<int> v(n, x); 大小可以用變數、初始值省略補 0;元素住連續記憶體、索引 O(1) 取用、增刪只有尾端快。

  3. 成員函式用點呼叫v.push_back(x)v.pop_back()v.back()v.size()v.empty()v.resize(n)——都是 變數.函式(參數) 的形式;reservecapacity 這些名字像的別亂用。

  4. vector 的陣列與巢狀 vector 收納多條數列:每條各自伸縮,記憶體大約只花實際元素總數(每條另有少量管理成本);條數上限已知用 vector<int> a[MAX_N];,條數執行時才知道用 vector<vector<int>>——g[i][j] 讀法同二維陣列。

  5. size() 回傳無號整數:空容器的 size() - 1 環繞成天文數字,是經典炸彈——size() 一到手就存進 int(競賽題的資料量上限都放得進 int,這樣轉才安全)。所有容器(含 string)都適用這條。

  6. iterator 是「容器裡的位置」begin() 指第一個元素、end() 指最後一個的下一格(含頭不含尾);*it 取值、v.begin() + i 是索引 i 處。inserterase 靠它指位置,但都是 O(n)——大量使用前先想想。

  7. vector 能 = 複製、能比較:複製是完整複製(O(n));==<8.9 的字典序。複製與比較這些內建陣列做不到的操作,vector 直接支援;大 vector 進函式記得掛 & 傳參考,避免整包複製。

  8. string 讓字串處理脫胎換骨:不用管 '\0'、不用猜大小;s.size()s[i]===+ 全部直接用;cin >> s 讀單詞的規則不變。

  9. string 解題三寶substr(pos, len) 取子字串、find 搜尋(跟 string::npos 比)、字典序比較一個符號。累加字串一律 +=——ans = ans + s 放迴圈是 n^2 的 TLE 炸彈;兩個字面常數不能相加也不能比較。

  10. 數字與字串互轉stoi(超出 int 範圍會 RE,大數用 stoll)、to_string;位數相關的題目「把數字當字串處理」常常更好寫——單一字元用 s[i] - '0'、整串用 stoi

  11. 整行輸入getline(cin, s) 讀一整行;前面有 cin >> 記得 cin.ignore() 清殘留換行;「每行數量不定」交給 stringstream——把一行變成迷你輸入流,ss >> x 用法同 cin


  1. pair 綁兩個值p.firstp.second;比較規則「先比 first、平手比 second」。vector<pair<int, int>> 是競程日常。

  2. (延伸)array 是披上容器外衣的陣列array<int, 3>,大小是型態的一部分;它可以整個複製、指派,所以能當 vector 的元素——普通陣列不行。