Я хотел бы скопировать до N элементов.std :: copy n элементов или до конца
template< class InputIt, class Size, class OutputIt>
OutputIt myCopy_n(InputIt first, InputIt last, Size count, OutputIt result)
{
Size c = count;
while (first != last && c > 0) {
*result++ = *first++;
--c;
}
return result;
}
Есть ли способ сделать это с помощью функций std? Я мог бы также:
template< class InputIt, class Size, class OutputIt>
OutputIt myCopy_n(InputIt first, InputIt last, Size count, OutputIt result)
{
if(std::distance(first, last) > count)
return std::copy_n(first,count,result);
return std::copy(first,last,result);
}
Однако, помимо того, что громоздкий, он идет в диапазоне дважды (расстояние, копия). Если я использую итератор преобразования или фильтр-итератор, это O (N) ненужные вызовы моей функции filter/transform.
template <class InputIt, class OutputIt>
OutputIt copy_n_max(InputIt begin, InputIt end, OutputIt last, size_t count)
{
return std::copy_if(begin, end, last,
[&count](typename std::iterator_traits<InputIt>::reference)
{ return count--> 0; });
}
int main()
{
std::vector<int> v({1,2,3,4,5,6,7,8,9}), out;
copy_n_max(v.begin(), v.end(), std::back_inserter(out), 40);
for(int i : out) std::cout <<i << " ,";
}
выходы 1,2,3,4,5,6,7,8,9,
однако, это будет продолжаться до конца, а не число раз. так еще более ненужные звонки на мой фильтровальной функции/преобразования ...
Можете ли вы уточнить, что вы пытаетесь сделать? – 2014-09-30 11:09:08
@remyabel Кажется довольно специфичным для меня. –
Честно говоря, ваше первое решение кажется самым простым; назовите это что-то вроде copy_upto_n() и назовите это днем; Он пересекает диапазон только один раз (наименьшее количество ограничений), и он никогда не делает больше, чем подсчет различий ввода, в отличие от третьего решения. Я был действительно удивлен тем, что copy_n не ведет себя таким образом, в первую очередь ... –