【发布时间】:2014-09-30 11:02:59
【问题描述】:
我想复制最多 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) 不必要的调用。
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,
但是,这将持续到结束,并且不计算次数。尽管如此,对我的过滤器/转换函数的更多不必要的调用......
【问题讨论】:
-
您能更具体地说明您要做什么吗?
-
@remyabel 这对我来说似乎很具体。
-
老实说,您的第一个解决方案似乎是最直接的;将其称为 copy_upto_n() 之类的名称,然后一天结束;与第三种解决方案不同,它只遍历范围一次(最少的约束),并且它永远不会超过计算输入的取消引用。实际上,我很惊讶 copy_n 一开始就没有那样做……
-
喜欢@Stefan,我最喜欢你的
myCopy_n。碰巧,这几乎就是我今天在stackoverflow.com/questions/54254075/… 上建议的内容。其他解决方案似乎过于复杂和/或过于受限。亲吻。 -
@Stefan:
copy_n不能这样做,因为它没有传递结束迭代器。
标签: c++ stl-algorithm