Which is better transform or views::transform for conversion?

63 views Asked by At

Is there a difference between the two provided examples? Is one more preferrable over the other?

std::vector<source> sources;
std::vector<dest> dests;
dests.reserve(sources.size());
std::ranges::transform(sources.begin(), sources.end(), std::back_inserter(dests), trFunction);
std::vector<source> sources;
auto view = sources | std::ranges::views::transform(trFunction);
std::vector<dest> dests{ view.begin(), view.end() };
1

There are 1 answers

0
Eugene On

The 1st way is incorrect. You should not both construct a non-zero-sized vector and use back_insterter. I.e., you can either:

//1a
std::vector<dest> dests;
dest.reserve( source.size() );
std::ranges::transform(sources.begin(), sources.end(), std::back_inserter(dests), trFunction);

or

//1b
std::vector<dest> dests( sources.size() ); //use (), not {}!
std::ranges::transform(sources.begin(), sources.end(), dests.begin(), trFunction);

Above, 1a is more flexible, because 1b requires dest to have a default constructor (and default-constructing all objects can be inefficient even if the default constructor is available).

Your 2nd version (using views::transform) is probably equivalent to 1a. Its only advantage is that it can be later extended with other views (e.g., if you also need to filter source elements).