C++ идея для стандарта.
От: pkl  
Дата: 02.03.18 10:35
Оценка: +1 :)
Есть 3 контейнера: a, b, c. Хочу запустить 1 range-цикл по ним всем одновременно:

for( auto i1 : a, auto i2 : b, auto i3 : c) {
    
}

На каждой итерации i1, i2, i3 имеет очередное значение из соответствующего контейнера.
Цикл помирает как только исчерпается самый мелкий контейнер.

Пример:
std::vector<int> a = {1, 2, 3};
std::vector<std::string> b = {"hello", "world", "foo", "bar"};
std::vector<int> c = {9, 8, 7, 6, 5, 4, 3, 2, 1, 0};

// Loop will stop after 3 iterations, because 'a' have minumal size = 3.
for ( auto i1 : a, auto i2 : b, auto i3 : c ) {
    std::cout << i1 << ", " << i2 << ", " << i3 << "\n";
}


Output:
1, hello, 9
2, world, 8
3, foo, 7


Жопа ли это? Я тупой наркоман? Можно ли это сделать уже щас без вундервафлинга?
Отредактировано 02.03.2018 10:39 pkl . Предыдущая версия . Еще …
Отредактировано 02.03.2018 10:36 pkl . Предыдущая версия .
Отредактировано 02.03.2018 10:36 pkl . Предыдущая версия .
Re: C++ идея для стандарта.
От: Kernan Ниоткуда https://rsdn.ru/forum/flame.politics/
Дата: 02.03.18 10:40
Оценка:
Здравствуйте, pkl, Вы писали:

pkl>Жопа ли это? Я тупой наркоман? Можно ли это сделать уже щас без вундервафлинга?

Ты можешь им предложить это лично. Улучшения так себе, если честно и мне кажется это можно решеть придумав класс-обёртку контейнер-контейнеров.
Sic luceat lux!
Re: C++ идея для стандарта.
От: night beast СССР  
Дата: 02.03.18 10:41
Оценка: 1 (1) +3
Здравствуйте, pkl, Вы писали:

pkl>Можно ли это сделать уже щас без вундервафлинга?


можно. получится что-то вроде zip_iterator
Re: C++ идея для стандарта.
От: GhostCoders Россия  
Дата: 02.03.18 10:58
Оценка:
Здравствуйте, pkl, Вы писали:

pkl>Есть 3 контейнера: a, b, c. Хочу запустить 1 range-цикл по ним всем одновременно:

Логично было бы сделать как три вложенных цикла

for( auto i1 : a, auto i2 : b, auto i3 : c) {
   
}


развернув в
for(auto i1 : a) {
    for(auto i2 : b) {
        for(auto i3 : c) {
        }
    }
}
Третий Рим должен пасть!
Re: C++ идея для стандарта.
От: uzhas Ниоткуда  
Дата: 02.03.18 11:11
Оценка: +2
Здравствуйте, pkl, Вы писали:

pkl>На каждой итерации i1, i2, i3 имеет очередное значение из соответствующего контейнера.

pkl>Цикл помирает как только исчерпается самый мелкий контейнер.

такой пробег обычно делается через zip. на плюсах это многословно можно сделать в бусте
слово zip можно встретить в хаскеле и питоне

расширять синтаксис C++ для zip кажется оверкилом, лучше что-то такое иметь в stl
Re[2]: C++ идея для стандарта.
От: pkl  
Дата: 02.03.18 11:15
Оценка:
Здравствуйте, night beast, Вы писали:

NB>Здравствуйте, pkl, Вы писали:


pkl>>Можно ли это сделать уже щас без вундервафлинга?


NB>можно. получится что-то вроде zip_iterator

Это несколько более жопно. Хочется в 1 строку встроенными средствами, не дописывая своих херен.
Отредактировано 02.03.2018 11:34 pkl . Предыдущая версия .
Re[2]: C++ идея для стандарта.
От: pkl  
Дата: 02.03.18 11:15
Оценка:
Здравствуйте, GhostCoders, Вы писали:

GC>Здравствуйте, pkl, Вы писали:


pkl>>Есть 3 контейнера: a, b, c. Хочу запустить 1 range-цикл по ним всем одновременно:

GC>Логично было бы сделать как три вложенных цикла

GC>
GC>for( auto i1 : a, auto i2 : b, auto i3 : c) {
   
GC>}
GC>


GC>развернув в

GC>
GC>for(auto i1 : a) {
GC>    for(auto i2 : b) {
GC>        for(auto i3 : c) {
GC>        }
GC>    }
GC>}
GC>

Не логично. У вложенных другая семантега.
Re[3]: C++ идея для стандарта.
От: GhostCoders Россия  
Дата: 02.03.18 11:23
Оценка: +2
Здравствуйте, pkl, Вы писали:

GC>>for( auto i1 : a, auto i2 : b, auto i3 : c) {

pkl>Не логично. У вложенных другая семантега.
Имею в виду, что для синтаксиса выше логичнее использовать вложенную семантику, а не zip.
Третий Рим должен пасть!
Re[4]: C++ идея для стандарта.
От: pkl  
Дата: 02.03.18 11:34
Оценка:
Здравствуйте, GhostCoders, Вы писали:

GC>Здравствуйте, pkl, Вы писали:


GC>>>for( auto i1 : a, auto i2 : b, auto i3 : c) {

pkl>>Не логично. У вложенных другая семантега.
GC>Имею в виду, что для синтаксиса выше логичнее использовать вложенную семантику, а не zip.
Не понял почему логичнее. Вы сначала бежите по внутреннему, потом делаете шаг по внешнему и заново бежите по внутреннему.
Re: C++ идея для стандарта.
От: rean  
Дата: 02.03.18 11:54
Оценка: +5
deleted
Отредактировано 22.04.2019 9:18 deleted2 . Предыдущая версия .
Re[2]: C++ идея для стандарта.
От: Nuzhny Россия https://github.com/Nuzhny007
Дата: 02.03.18 12:08
Оценка:
Здравствуйте, rean, Вы писали:

R>А три итератора и использование обычного while цикла и трех проверок на end() уже не C++? Надо обязательно стандарт менять?


...или 1 индекс.
Re[2]: C++ идея для стандарта.
От: pkl  
Дата: 02.03.18 12:10
Оценка:
Здравствуйте, rean, Вы писали:

pkl>>Жопа ли это? Я тупой наркоман? Можно ли это сделать уже щас без вундервафлинга?


R>А три итератора и использование обычного while цикла и трех проверок на end() уже не C++? Надо обязательно стандарт менять?

Ну поменяли же стандарт, введя range based loops, хотя можно было обойтись итераторами.
Re[5]: C++ идея для стандарта.
От: uzhas Ниоткуда  
Дата: 02.03.18 12:26
Оценка: +4
Здравствуйте, pkl, Вы писали:

pkl>Не понял почему логичнее.


потому что это самая первая ассоциация, когда видишь такой код. похоже на list comprehension: https://en.wikipedia.org/wiki/List_comprehension
Re: C++ идея для стандарта.
От: kov_serg Россия  
Дата: 02.03.18 12:29
Оценка:
Здравствуйте, pkl, Вы писали:

pkl>Жопа ли это? Я тупой наркоман? Можно ли это сделать уже щас без вундервафлинга?


https://stdcpp.ru/proposals
Отредактировано 02.03.2018 12:29 kov_serg . Предыдущая версия .
Re[6]: C++ идея для стандарта.
От: pkl  
Дата: 02.03.18 12:44
Оценка:
Здравствуйте, uzhas, Вы писали:

U>Здравствуйте, pkl, Вы писали:


pkl>>Не понял почему логичнее.


U>потому что это самая первая ассоциация, когда видишь такой код. похоже на list comprehension: https://en.wikipedia.org/wiki/List_comprehension

У чувака код работает не так: он много раз бегает по 3, меньше раз бегает по 2 и один раз бегает по 1.
Это совсем не то, что делал мой код из первого поста.
Re[7]: C++ идея для стандарта.
От: uzhas Ниоткуда  
Дата: 02.03.18 12:56
Оценка:
Здравствуйте, pkl, Вы писали:

pkl>У чувака код работает не так


давай ты зажмуришь глаза, сделаешь глубокий вдох и выдох, а потом перечитаешь ветку и попробуешь понять, что тебе пишут
ок?
Re: C++ идея для стандарта.
От: Nikе Россия  
Дата: 02.03.18 13:03
Оценка: +1
Здравствуйте, pkl, Вы писали:

pkl>Есть 3 контейнера: a, b, c. Хочу запустить 1 range-цикл по ним всем одновременно:


pkl>
pkl>for( auto i1 : a, auto i2 : b, auto i3 : c) {
    
pkl>}
pkl>

А почему не как-то так:
for ( auto i1, i2, i3 : std::tie( a, b, c ) )
Нужно разобрать угил.
Re[2]: C++ идея для стандарта.
От: so5team https://stiffstream.com
Дата: 02.03.18 13:07
Оценка:
Здравствуйте, Nikе, Вы писали:

N>А почему не как-то так:

N>for ( auto i1, i2, i3 : std::tie( a, b, c ) )

Легко перепутать со structured binding из C++17:
auto [i1, i2, i3] = std::tie(a, b, c);

?
Re[2]: C++ идея для стандарта.
От: rean  
Дата: 02.03.18 13:35
Оценка:
deleted
Отредактировано 22.04.2019 9:18 deleted2 . Предыдущая версия .
Re[3]: C++ идея для стандарта.
От: uzhas Ниоткуда  
Дата: 02.03.18 13:50
Оценка:
Здравствуйте, rean, Вы писали:

R>Посмотрел, насколько сложно получается. Получается не сложно и вполне читаемо:


у тебя нечитаемо, но это неважно, т.к. работает неправильно
вот так надо: https://ideone.com/ElqIsk
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.