【发布时间】:2016-08-28 17:14:33
【问题描述】:
我编写了一个将字符串转换为数字的函数。我看到了两种可能的写法:
int convert(const std::string input) {
if (input == "one") {
return 1;
} else if (input == "two") {
return 2;
}
// etc.
return 0;
}
或者
int convert(const std::string input) {
static const map<string, int> table = {
{"one", 1},
{"two", 2}
// etc.
}
const auto result = table.find(input);
if (result == table.end())
{
return 0;
}
return result->second;
}
哪种方式更有效/可接受/可读?
【问题讨论】:
-
你应该明确基数和命中频率。如果你有几个字符串,或者大多数命中是字符串的一小部分,那么第一个。但一般来说,从十几个字符串开始 - 后者。不要忘记计算第一次调用后一个变体的开销。一般来说,IME 越晚越好,因为它更容易维护。
-
@ChrisDrew 你是对的。我想用另一种方式搜索,但我没有仔细查看代码。
-
我会使用
std::unordered_map-O(1)摊销查找很好! -
我认为
input参数应该作为对const的引用传递 -
@erip:在这种情况下,渐近复杂性保证是相当不相关的。此外,
std::map速度非常慢,std::unordered_map在容器运行时相对较慢。
标签: c++ c++11 if-statement dictionary