c++ std :: copy n元素或结尾

我想复制最多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);
翻译自:https://stackoverflow.com/questions/26119212/stdcopy-n-elements-or-to-the-end

转载注明原文:c++ std :: copy n元素或结尾