Информация об изменениях

Сообщение Re[2]: Может я чего-то не понимаю.... от 05.08.2023 13:27

Изменено 05.08.2023 13:32 Sm0ke

Re[2]: Может я чего-то не понимаю....
Здравствуйте, 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>


чтож, неплохо!
Посмотрим детальнее

ranges::to — из 23-го стандарта
Согласно cppref поддержка есть в:
* clang 17 (которого пока нет на готболт)
* msvc 19.34 (и он там есть)

Вы используете using-и, чтобы укоротить основную строчку, однако они сами добавляют отдельные строчки (хз честно это или нет).
Вы забыли включить #include <vector> ( придираюсь к мелочам :Р )

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 — конечно удобнее.
Re[2]: Может я чего-то не понимаю....
Здравствуйте, 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 — конечно удобнее.