给定一个通常未排序的数据(例如 )的数组v
(一些STL容器,例如)。在数组的元素上定义了比较运算符,比如. 您需要创建一个包含最少元素的数组(复制 form ),但这些元素不是默认可构造的(或者是昂贵的操作)。如何通过STL做到这一点?需要非修改序列算法。std::vector< double >
assert(std::is_same< typeof(v), V >::value);
std::less
n
v
最初被视为解决 using 的一种方法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