ホームページを見ましたが、下記の件について直接の回答はありません。
C++で文字列内の部分文字列のn番目の出現を見つける最も効率的な方法は何ですか?
次の例は、2 番目のオカレンスを見つける方法を示しています: http://www.cplusplus.com/reference/string/string/find/
しかし、最初の一致を最初に見つけてから、その場所を使用して次の一致を検索するなど、n番目の一致を見つけるのは非常に効率が悪いようです。第25試合の順位が欲しいのですが、もっと早い方法はありますか?
編集:より大きなコンテキストでは、ファイルを 1 行ずつ読んでいます。項目へのすべての応答にはスコアがあり、一部は欠落しており、NA
文字列を取得しています。すべての項目はスペースで区切られています。
特定の項目を除外するオプションが必要なため、項目 35 から 80、90 から 120、および 150 から 200 のみを検索します。だから私が現在していることはこれです:
string blockedLine(string line)
{
int b_start[] = {35, 90, 150};
int b_end[] = {80, 120, 200};
std::vector<int> space_matches = KMP(line, " ");
string cuttedLine = "";
for (int i = 0; i < 3; i++)
{
cuttedLine.append(line.substr(space_matches[b_start[i]],
space_matches[b_end[i]]));
}
return(cuttedLine);
}
コメントの1つに記載されている関数はどこKMP
にありますか。これにより、スペースの発生位置が取得され、space_matches
.
NA
次に、この追加された文字列での出現回数を数えます。問題は、この追加がなければ、行全体を読み取るだけで、約 20 万行で 1 秒しかかからないということです。この追加メソッドを使用して部分文字列を取得すると、14 秒かかり、遅すぎます。
これをスピードアップするための改善点は何ですか?