Во-первых, версия Георга с картой более элегантна и расширяема, чем длинный каскад сравнений.Однако, если вас интересует производительность и ваш «каскад» «медленный», измерьте, насколько он быстр.
Для приведенных вами примеров строк я построил три варианта функции, которые увеличивают значение в массиве.на основе строки, переданной ему.Первый основан на вашем коде, второй - на Георге, а третий - на приведенном ниже коде, который такой же, как ваш, но с постоянными строками, вместо того, чтобы создавать строки из литералов при каждом вызове.
void foo (const std::string& str, int (&count)[6])
{
static const std::string s0 = "something";
static const std::string s1 = "something else";
static const std::string s2 = "something more";
static const std::string s3 = "something again";
static const std::string s4 = "something different";
static const std::string s5 = "something really different";
if(str == s0) {
++count[0];
}else if(str == s1) {
++count[1];
}else if(str == s2) {
++count[2];
}else if(str == s3) {
++count[3];
}else if(str == s4) {
++count[4];
}else if(str == s5) {
++count[5];
}
}
При использовании VS 2008 Express с настройками выпуска по умолчанию они выглядят так:
operator== with constant strings (the code above)
time 7.015 seconds
0.116917 microseconds per call
std::map lookup (Georg's code)
time 9.687 seconds
0.16145 microseconds per call
operator== with literal strings (original code)
time 10.437 seconds
0.17395 microseconds per call
Так что, если вы не будете много звонить по коду, вы не собираетесьобратите внимание на 174 наносекунды для вашей оригинальной версии.Предполагая, что карта и if-каскад ведут себя, как и ожидалось (O (N) и O (log 2 N)), тогда карта должна быть быстрее, примерно в 13 строках.Но если это так важно для вас, тогда оцените его или оцените.