一般的にソートされていないデータ(たとえば)の配列v
(たとえば、いくつかのSTLコンテナ)が与えられます。配列の要素には、たとえば、定義された比較演算子があります。最小限の要素(コピー形式)で配列を作成する必要がありますが、要素はデフォルトで構築可能ではありません(またはコストのかかる操作です)。STLを使用してそれを行う方法は?非変更シーケンスアルゴリズムが必要です。std::vector< double >
assert(std::is_same< typeof(v), V >::value);
std::less
n
v
もともとはを使用して解決する方法と見なされていましたstd::back_insert_iterator
が、さらに説明するようにいくつかの混乱があります。
assert(!std::is_default_constructible< typename V::value_type >::value); // assume
template< class V >
V min_n_elements(typename V::const_iterator begin, typename V::const_iterator end, typename V::size_type const n)
{
assert(!(std::distance(begin, end) < n));
V result; // V result(n); not allowed
result.reserve(n);
std::partial_sort_copy(begin, end, std::back_inserter(result), /*What should be here? mb something X(result.capacity())?*/, std::less< typename V::value_type >());
return result;
}
時間とメモリの観点から最適なソリューションを見つけたい(O(1)追加メモリと<= O(std::partial_sort_copy
)時間消費)。完全にアルゴリズムは、次の数のメモリで動作する必要があります。入力としてv.size()
の変更不可能なソースの要素と、出力としてのソース配列の最小要素のコピーである新しく作成された要素の要素。それで全部です。これは現実的な限界だと思います。v
n
n
v