Vorrei copiare fino a N elementi.std :: copia n elementi o alla fine
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;
}
c'è un modo per farlo con le funzioni std? Ho potuto anche:
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);
}
però, oltre ad essere ingombrante, va oltre la gamma due volte (distanza, copia). Se sto usando un iteratore di trasformazione o un filtro iteratore, quelle sono chiamate non necessarie (N) alla funzione filtro/trasformazione.
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 << " ,";
}
uscite 1,2,3,4,5,6,7,8,9,
tuttavia, questo continuerà fino alla fine, e non contare volte. così ancora, più chiamate inutili al mio filtro funzione/trasformare ...
Puoi essere più specifico su ciò che stai cercando di fare? –
@remyabel Mi sembra abbastanza specifico. –
Per essere onesti, la prima soluzione sembra la più semplice; chiamalo qualcosa come copy_upto_n() e chiamalo un giorno; Attraversa la gamma solo una volta (quantità minima di vincoli) e non fa mai più del conteggio delle dereferenze dell'input, a differenza della terza soluzione. Sono stato davvero sorpreso dal fatto che copy_n non si comporta in questo modo in un primo momento ... –