私はこの問題にかなり頻繁に遭遇します。シーケンスが与えられた場合、k 最小の要素を見つけます。問題はそれほど難しいことではありませんが、私が探しているのは、両方とも安全な「慣用的な」方法です (エラー)、意図をうまく伝えます。したがって、最終的に行うことは、シーケンスをソートしてから、最初の k 要素を取得することです。
std::sort(container.begin(),container.end());
std::vector<T> k_smallest(container.begin(),container.begin() + k);
これは安全で理解しやすいように思えますが、ここでの複雑さは単に n ではなく nlogn + k です。皆さんはこれをどのように行いますか、車輪を再実装することなく最適な複雑さを与える、(多分からいくつかのあいまいな関数を使用して) 偶像的な方法はありますか?