我遞歸調用一個函數作爲參數傳遞一個子字符串,該字符串始終從當前字符串的開始位置開始。如果我使用C,我可以將指針傳遞給字符串的第一個位置,然後將必要的長度傳遞給該字符串的第一個位置。不過,我想用類string
來達到相同的結果。可能嗎?如果我使用const
,編譯器是否足夠聰明,可以自行進行優化?更妙的是,有沒有一種方法可以自行檢查編譯器是否實際上創建了參數副本或傳遞了引用?如何通過引用傳遞子字符串?
我的問題是在寫了下面的代碼,通過poj上的問題Alphacode上的測試之後,一旦有人使用atoi
而不是atof
後動機。
#include <iostream>
#include <algorithm>
#include <map>
#include <vector>
#include <string>
using namespace std;
map<string, int> cache;
bool valid_character_number(string a) {
return 0 < stoi(a.substr(a.size() - 2, 2)) && stoi(a.substr(a.size() - 2, 2)) <= 26;
}
bool zero_last_digit(string a) {
return a[a.size() - 1] == '0';
}
bool zero_before_last_digit(string a) {
return a[a.size() - 2] == '0';
}
int decodings(string a) {
if (a.size() == 0)
return 1;
if (a.size() == 1) {
if (zero_last_digit(a))
return 0;
else
return 1;
}
if (cache.find(a) != cache.end())
return cache[a];
if (zero_last_digit(a) && valid_character_number(a))
return cache[a] = decodings(a.substr(0, a.size() - 2));
else if (valid_character_number(a) && !zero_before_last_digit(a))
return cache[a] = decodings(a.substr(0, a.size() - 1)) + decodings(a.substr(0, a.size() - 2));
else
return cache[a] = decodings(a.substr(0, a.size() - 1));
}
int main() {
string input;
while (true) {
cin >> input;
if (input.size() == 1 && stoi(input) == 0)
return 0;
cout << decodings(input) << endl;
}
return 0;
}
我看不到任何地方你的函數修改參數。使用'const std :: string&'。 – chris 2013-03-19 02:00:58
請參閱['boost :: string_ref'](http://www.boost.org/libs/utility/doc/html/string_ref.html)。 – ildjarn 2013-03-20 19:05:21