Здравствуйте, vdimas, Вы писали:
V>V>#include <iostream>
V>#include <ranges>
V>#include <boost/phoenix.hpp>
V>int main() {
V> using namespace std;
V> using views::filter;
V> using views::transform;
V> using boost::phoenix::placeholders::_1;
V> //===========================================================
V> auto const v1 = { 1, 2, 3, 4, 5, 3 };
V> auto rng = v1 | filter(_1 % 2 == 0) | transform(_1 / 2);
V> auto const vec = rng | ranges::to<vector>();
V> //===========================================================
V> ostream_iterator<int> const out { cout, " " };
V> ranges::copy(v1, out), cout << std::endl;
V> ranges::copy(rng, out), cout << std::endl;
V> ranges::copy(vec, out), cout << std::endl;
V> return 0;
V>}
V>
чтож, неплохо!
Посмотрим детальнее
Вы забыли включить #include <vector> ( придираюсь к мелочам :Р )
Вроде рабочий вариант:
https://godbolt.org/z/W17nbz8qx
ranges::to — из 23-го стандарта
Согласно
cppref поддержка есть в:
* clang 17 (которого пока нет на готболт)
* msvc 19.34 (и он там есть)
Вы используете using-и, чтобы укоротить основную строчку, однако они сами добавляют отдельные строчки (хз честно это или нет).
V>Если "в одну строчку", то удобно использовать ренжи.
Там у вас две строки, а если в одну, то for всё равно короче)
vec = v1 | filter(_1 % 2 == 0) | transform(_1 / 2) | ranges::to<vector>();
for( auto it : v1 ) if( it % 2 == 0 ) { vec.push_back(it / 2); }
Однако для повторного использования забиндить цепочку изменений в переменную rng — конечно удобнее.