Лучший способ найти массив содержит заданную строку

У меня есть несколько массивов строк и функция, которая получает строку и возвращает ее тип (массив, которому принадлежит строка)

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

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

Решение

Это не элегантно, но если вы хотите быстро, вы можете создать подготовленный unordered_map для поиска, который будет полезен, если эта функция будет вызываться сотни раз (расточительно, если редко вызывается). В идеале вы можете сделать этот контейнер в объекте класса, а не в глобальной переменной, а возвращаемый тип — целое значение, а не строка. Это приведет к поиску 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
0

Другие решения


По вопросам рекламы ammmcru@yandex.ru
Adblock
detector