2

私はこのベクトルを持っています

vector <string> data

data = ["this is", "data that", "is in", "this is", "vector", "vector", "vector"]

重複を削除し、代わりに各i番目のエントリのカウントを持つベクトル(または2D配列)を取得するにはどうすればよいですか?

すなわち

 results = [("this is", 2), ("data that", 1), ("is in", 1), ("vector", 3)]
4

1 に答える 1

5

簡単な解決策は、一意の値とそのカウントをマップに蓄積することです。

std::map<std::string, std::size_t> results;
std::for_each(begin(data), end(data), [&](std::string const& s)
{
    ++results[s];
});

これには線形(n lg n)の時間計算量がありますが、それぞれの個別の文字列値のコピーを作成する必要があるため、かなりコストがかかる可能性があります。リストをインプレースで並べ替えてから、各値の数を数えることもできます。これは、の移動対応の実装がある場合にパフォーマンスが向上する可能性がありますstd::string

于 2012-05-23T23:59:25.727 に答える