
2014/1/5 Brian Davis <bitminer@gmail.com>
Is there a 1 line wonder for counting iterator and back_inserter - say a counting iterator where the start and step can be specified?
The following code creates an vector of angles from zero to N-1 * angle step;
std::vector angles; float angle_step = 0.275; int number_angles = 293;
std::copy( boost::counting_iterator<float>(0), boost::counting_iterator<float>(number_angles), std::back_inserter(angles) );
std::copy( boost::make_transform_iterator(angles.begin(), boost::bind1st(std::multiplies<float>(), angle_step )), boost::make_transform_iterator(angles.end(), boost::bind1st(std::multiplies<float>(), angle_step )), angles.begin() );
Is there or could there be a counting iterator or other mechanism to do this in 1 line? Say where the start and step could be specified?
Thanks
I recommend Boost.Range. In your example I also suggest using Boost.Phoenix instead of bind1st and multiplies; and push_back from Boost.Range instead of back_inserter. #include <boost/phoenix/core.hpp> #include <boost/phoenix/operator.hpp> #include <boost/range/irange.hpp> #include <boost/range/adaptor/transformed.hpp> #include <boost/range/algorithm/copy.hpp> #include <boost/range/algorithm_ext/push_back.hpp> #include <iostream> #include <iterator> #include <vector> using namespace boost::phoenix::placeholders; namespace ad = boost::adaptors; static int const N = 10; static float const STEP = 0.5; int main() { std::vector<float> x, y; boost::copy( boost::irange(0,N) | ad::transformed( _1 * STEP ), std::back_inserter(x) ); boost::push_back( y, boost::irange(0,N) | ad::transformed( _1 * STEP ) ); boost::copy( x, std::ostream_iterator<float>(std::cout, " ") ); std::cout << std::endl; boost::copy( y, std::ostream_iterator<float>(std::cout, " ") ); std::cout << std::endl; } Regards, Kris