2

指定された文字列が配列内のいずれかと一致するかどうかを確認するために、既知の文字列と文字列の配列を比較する最も効率的な方法は何でしょうか?

例:

string String1 = "ID5";
string String2 = "ID7";

それらのいずれかが以下に含まれているかどうかを確認したい

string List[5] = {"ID1", "ID7", "ID10", "ID34", "ID62"}

あなたがこれを行うことができるように

 if(#STRINGMATCHES) {
    // Do one thing
 }
 else {
    // Do another
 }
4

5 に答える 5

2

この検索操作を何度も実行する必要がある場合は、ここで提案します。ハッシュ関数を使用してすべての文字列をハッシュし、ソートされたハッシュを含む新しい配列を作成します。次に、文字列が配列に含まれているかどうかを確認する必要がある場合は、ソートされた配列でそのハッシュの binary_search を実行します。これは、als によって提案されているように std::find を実行するよりもはるかに効率的ですが、検索操作を十分な回数実行して、速度の向上がソートのオーバーヘッドを補う必要があるという事実に依存します。

于 2012-04-11T07:32:01.740 に答える
2

std::findを使用する

std::find(List, List+5, String1)
于 2012-04-11T07:24:04.113 に答える
1

配列がソートされている場合は、次を使用できますstd::binary_search()

std::string List[] = { "ID1", "ID10", "ID7", "ID34", "ID62" };
if (std::binary_search(std::begin(List), std::end(List), "ID7"))
{
    std::cout << "found string\n";
}

そうでない場合は、使用しますstd::find()(Alsがすでに述べたように)。

于 2012-04-11T07:28:33.640 に答える
1

最も簡単な解決策は、探している文字列を配列に入れて使用することですstd::find_first_of

std::string targetList[] = { "ID5", "ID7" };
std::string searchList[] = { "ID1", "ID2", "ID3", "ID4", "ID5" };

if ( std::find_first_of( begin( searchList ), end( searchList ),
                         begin( targetList ), end( targetList ) )
        != end( targetList ) ) {
    //  found...
} else {
    //  not found...
}

find_first_ofはデータに関する仮定を行わないため、これは必ずしも最も効率的なソリューションではありません 。たとえば、検索リストが非常に大きく、変更されず、ターゲット リストに少数の要素しか含まれていない場合は、検索リストを並べ替えて、ターゲット リスト内の各要素に対してバイナリ検索を実行する方が効率的である可能性があります。

于 2012-04-11T07:40:55.157 に答える