644 - Immediate Decodability(Update)

在 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

相關文章
相關標籤/搜索