在 644 - Immediate Decodability 的解法中, 爲了查找一個字符串是否在一個 vector 中, 使用了 <algorighm> 中的 search 函數, 感受很不優美; 後來發出 find_if 函數能夠知足我最初的想法, 使用 find_if 實現的代碼以下: ios
有幾個新知識點:
1. find_if 能夠指定一個自定義 unary 函數進行比較.
2. 使用 bind1st 把 binary 函數轉爲 unary 函數.
3. 使用 ptr_fun 把 function pointer 轉化爲 function object.
c++
代碼:
函數
# include <iostream> # include <string> # include <cstdio> # include <cstring> # include <vector> # include <algorithm> # include <functional> // bind1st # include <cctype> using namespace std; // bind1st 或 bind2nd 在這裏都是可用的,c++ 11 中 bind 更好用 // ptr_fun 轉 function 指針爲函數對象 // 如果簡單的相等,能夠直接用 equal_to<string>() // 比較兩個字符串相等, 當一個字符串是另外一個字符串的前綴時也相等 bool immediateCompare(string str1, string str2){ int len = min(str1.size(), str2.size()); for(int i=0; i<len; i++){ if(str1[i] != str2[i]) return false; } return true; } int main(int argc, char const *argv[]) { #ifndef ONLINE_JUDGE freopen ("644_i.txt", "r", stdin); freopen ("644_o.txt", "w", stdout); #endif int groupNum = 0; string line; bool immediately = true; vector<string> group; while(!cin.eof()){ getline(cin, line); // 新的一個 group 開始, 輸出並重置 immediately 和 group if(line == "9"){ if(immediately){ cout << "Set " << ++groupNum << " is immediately decodable" << endl; }else{ cout << "Set " << ++groupNum << " is not immediately decodable" << endl; } immediately = true; group.clear(); continue; } // 若是前面已經判斷出是 not immediately 了, 那麼後面的操做無需再進行 if(!immediately) continue; // 判斷 group 中是否有和當前 line 爲前綴的字符串, 如有, 則 immediately 爲 true if(find_if(group.begin(), group.end(), bind1st(ptr_fun(immediateCompare), line)) != group.end()) immediately = false; group.push_back(line); } return 0; }
環境: C++ 4.5.3 - GNU C++ Compiler with options: -lm -lcrypt -O2 -pipe -DONLINE_JUDGE
spa