c++ c++11 stl stdvector iota

c++ - Establezca std:: vector<int> en un rango



c++11 stl (4)

¿Cuál es la mejor manera de configurar un std::vector<int> en un rango, por ejemplo, todos los números entre 3 y 16?


Podría usar std::iota si tiene soporte para C ++ 11 o está usando la STL :

std::vector<int> v(14); std::iota(v.begin(), v.end(), 3);

o implementa el tuyo si no.

Si puedes usar boost , entonces una buena opción es boost::irange :

std::vector<int> v; boost::push_back(v, boost::irange(3, 17));


Ver por ejemplo esta question

#include <algorithm> #include <iostream> #include <iterator> #include <vector> template<class OutputIterator, class Size, class Assignable> void iota_n(OutputIterator first, Size n, Assignable value) { std::generate_n(first, n, [&value]() { return value++; }); } int main() { std::vector<int> v; // no default init v.reserve(14); // allocate 14 ints iota_n(std::back_inserter(v), 14, 3); // fill them with 3...16 std::for_each(v.begin(), v.end(), [](int const& elem) { std::cout << elem << "/n"; }); return 0; }

Salida en Ideone


std :: iota - es útil, pero requiere iterador, antes de la creación del vector, ... así que tomo mi propia solución.

#include <iostream> #include <vector> template<int ... > struct seq{ typedef seq type;}; template< typename I, typename J> struct add; template< int...I, int ...J> struct add< seq<I...>, seq<J...> > : seq<I..., (J+sizeof...(I)) ... >{}; template< int N> struct make_seq : add< typename make_seq<N/2>::type, typename make_seq<N-N/2>::type > {}; template<> struct make_seq<0>{ typedef seq<> type; }; template<> struct make_seq<1>{ typedef seq<0> type; }; template<int start, int step , int ... I> std::initializer_list<int> range_impl(seq<I... > ) { return { (start + I*step) ...}; } template<int start, int finish, int step = 1> std::initializer_list<int> range() { return range_impl<start, step>(typename make_seq< 1+ (finish - start )/step >::type {} ); } int main() { std::vector<int> vrange { range<3, 16>( )} ; for(auto x : vrange)std::cout << x << '' ''; } Output: 3 4 5 6 7 8 9 10 11 12 13 14 15 16


std::vector<int> myVec; for( int i = 3; i <= 16; i++ ) myVec.push_back( i );