Зависит от того, заботитесь ли вы о производительности.
Если нет, то простейший код, вероятно, состоит в том, чтобы поместить различные строки в массив (или вектор, если вы хотите увеличить число констант во время выполнения). Это также будет довольно быстро для небольшого числа строк:
static const char *const strings[] = { "fee", "fie", "fo", "fum" };
static const int num_strings = sizeof(strings) / sizeof(char*);
Тогда либо:
int main() {
const char *search = "foe";
bool match = false;
for (int i = 0; i < num_strings; ++i) {
if (std::strcmp(search, strings[i]) == 0) match = true;
}
}
Или:
struct stringequal {
const char *const lhs;
stringequal(const char *l) : lhs(l) {}
bool operator()(const char *rhs) {
return std::strcmp(lhs, rhs) == 0;
}
};
int main() {
const char *search = "foe";
std::find_if(strings, strings+num_strings, stringequal(search));
}
[Предупреждение: я не проверял приведенный выше код, и у меня уже несколько раз были неправильные подписи ...]
Если вы заботитесь о производительности и у вас есть разумное количество строк, тогда одним быстрым вариантом будет что-то вроде Trie . Но это много усилий, так как в стандартной библиотеке C ++ его нет. Вы можете получить большую выгоду, используя отсортированный массив / вектор, поиск в котором std::binary_search
:
// These strings MUST be in ASCII-alphabetical order. Don't add "foo" to the end!
static const char *const strings[] = { "fee", "fie", "fo", "fum" };
static const int num_strings = sizeof(strings) / sizeof(char*);
bool stringcompare(const char *lhs, const char *rhs) {
return std::strcmp(lhs, rhs) < 0;
}
std::binary_search(strings, strings+num_strings, "foe", stringcompare);
... или используйте std::set
. Но если вы не меняете набор строк во время выполнения, нет никакого преимущества в использовании набора над отсортированным массивом с двоичным поиском, и набор (или вектор) должен быть заполнен кодом, тогда как массив может быть статически инициализирован , Я думаю, что C ++ 0x улучшит ситуацию со списками инициализаторов для коллекций.