我递归地调用一个函数作为参数传递一个子串,它始终从当前字符串的开头一直到一个位置.如果我使用C,我可以将指针传递给字符串的第一个位置,然后是必要的长度.不过,我想使用类字符串实现相同的结果.可能吗?如果我使用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; }