gpt4 book ai didi

c++ - std::copy n 个元素或到最后

转载 作者:IT老高 更新时间:2023-10-28 21:40:27 28 4
gpt4 key购买 nike

我想复制最多 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,

但是,这将持续到结束,并且不计算次数。尽管如此,对我的过滤器/转换函数的更多不必要的调用......

最佳答案

如果您可以访问整个数据结构及其大小,则可以使用以下内容:

std::vector<int> v1, v2;
std::copy_n(v2.begin(), std::min(NUM, v2.size()), std::back_inserter(v1));

如果您只能访问迭代器,我不知道如何只使用 std 函数而不计算距离。这对于随机访问迭代器来说很便宜,但重复对于其他类型也有效。

std::vector<int>::iterator i_begin, i_end, o_begin;
std::copy_n(i_begin, std::min(NUM, std::distance(i_begin, i_end)), o_begin);

关于c++ - std::copy n 个元素或到最后,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26119212/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com