查找包含给定字符串的数组的最佳方法

Best Way to Find the Array Contains a Given String

本文关键字:数组 方法 最佳 字符串 包含 查找      更新时间:2023-10-16

我有一些字符串数组和一个函数,该函数获取字符串并返回其类型(字符串所属的数组)

如何以最佳速度做到这一点?

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";
...
}

谢谢

这并不优雅,但是如果您想要快速,则可以准备好unordered_map进行搜索,如果此函数将被调用100次(如果很少调用,则会浪费)。 理想情况下,可以将此容器设置为类对象而不是全局变量,并将返回类型设置为整数值而不是字符串。 这将产生对 O(1) 的搜索,成本在于密钥的哈希。 但我对你的要求还不够了解。

如果你宁愿打一次电话,那就按照Joachim Pileborg的建议去做,做一系列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