std :: kopiere n Elemente oder bis zum Ende

Ich möchte bis zu N Elemente kopieren.

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;
}

Gibt es eine Möglichkeit, dies mit Standardfunktionen zu tun? Ich könnte auch:

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);
}

es ist jedoch nicht nur umständlich, sondern geht auch zweimal über den Bereich (Entfernung, Kopie). Wenn ich einen Transformationsiterator oder Filteriterator verwende, sind dies O (N) unnötige Aufrufe meiner Filter- / Transformationsfunktion.

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 << " ,";
}

Ausgaben 1,2,3,4,5,6,7,8,9,

dies wird jedoch bis zum Ende fortgesetzt und nicht mehr gezählt. also noch unnötigere aufrufe auf meine filter / transform funktion ...

Antworten auf die Frage(4)

Ihre Antwort auf die Frage