2014-12-14 2 views
0

У меня есть некоторые массивы строк и функцию, которая получает строку и возвращает тип его (массив, что строка принадлежит)Лучший способ найти массив содержит заданную строку

Как я могу это сделать с лучшей скоростью?

string arr1[] = {"a", "b", "c"}; 
string arr2[] = {"d", "e", "f"}; 
string arr3[] = {"g", "h", "i"}; 
string arr4[] = {"j", "k", "l"}; 

... 
string getFamily(string input) 
{ 
if(arr1.contains(input) 
return "TYPE_1"; 
... 
} 

Благодаря

+0

Чтение о [ 'станд :: find'] (http://en.cppreference.com/w/cpp/algorithm/find) должен быть хорошим началом. –

+0

Я забыл сказать, что я не хочу делать это с большим количеством, если иначе. потому что у меня много массивов. – user2956536

+0

Должна ли быть функция или вы можете создать экземпляр класса? –

ответ

0

Это не элегантное, но если вы хотите быстро, то вы можете сделать подготовленный unordered_map сделать поиск, который будет полезен, если эта функция будет называться 100s раза (расточительно, если редко называется). В идеале вы можете сделать этот контейнер в объекте класса, а не в глобальной переменной, а тип возвращаемого значения - целочисленным значением, а не строкой. Это приведет к поиску O (1) со стоимостью, находящейся в хешировании ключа. Но я не знаю ваших требований.

Если вы предпочитаете звонить один раз, сделайте так, как предположил Йоахим Пилеборг, и выполните серию вызовов std :: find, пока не получите хит.

#include <iostream> 
#include <unordered_map> 
#include <string> 

std::unordered_map< std::string, std::string > g_map; 

std::string arr1[] = {"a", "b", "c"}; 
std::string arr2[] = {"d", "e", "f"}; 
std::string arr3[] = {"g", "h", "i"}; 
std::string arr4[] = {"j", "k", "l"}; 

const char * map_value(const std::string & input) 
{ 
    std::unordered_map< std::string, std::string >::iterator iter(g_map.find(input)); 
    return iter == g_map.end() ? "NOT FOUND" : iter->second.c_str(); 
} 

int main(int argc, char ** argv) 
{ 
    // Build the map; 
    for(int i = 0; i < sizeof(arr1)/sizeof(std::string); ++i) 
     g_map[arr1[i]] = "TYPE_1"; 
    for(int i = 0; i < sizeof(arr2)/sizeof(std::string); ++i) 
     g_map[arr2[i]] = "TYPE_2"; 
    for(int i = 0; i < sizeof(arr3)/sizeof(std::string); ++i) 
     g_map[arr3[i]] = "TYPE_3"; 
    for(int i = 0; i < sizeof(arr4)/sizeof(std::string); ++i) 
     g_map[arr4[i]] = "TYPE_4"; 

    std::string input; 
    std::cout << map_value("b") << std::endl; 
    std::cout << map_value("z") << std::endl; 
    std::cout << map_value("eb") << std::endl; 
    std::cout << map_value("j") << std::endl; 
    std::cout << map_value("f") << std::endl; 
    return 0; 
} 

Выход:

TYPE_1 
NOT FOUND 
NOT FOUND 
TYPE_4 
TYPE_2 
Смежные вопросы