- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
for(const auto & row : table; const auto & element : row) {
handle(element);
}
// versus
for(const auto & row : table) {
for(const auto & element : row) {
handle(element);
}
}
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
+129
for(const auto & row : table; const auto & element : row) {
handle(element);
}
// versus
for(const auto & row : table) {
for(const auto & element : row) {
handle(element);
}
}
Всякого ненужного говна в новые крестостандарты насовали, а о простых вещах не подумали. Ну ведь удобней же было бы!
Но не-ет, нам нужна функциональщина в крестах, ведь нам мало мозгоклюйства с другими языками; а давайте засунем в стандартную библиотеку либкайро, чтобы разработчики стандартных библиотек соревновались, кто быстрее запилит частичную поддержку в 95% случаев ненужной либы полутра операционными системами, куда-ах-тах-тах!
Забавно, только что узнал, что в vs2013 есть шорткат ^ko, который переключает между заголовком и реализацией. ^ko^ko^ko
Если уж очень хочется, то можно как-то так:
Нужно только написать функцию flatten, которая берёт range однотипных range-й и превращает их в один плоский range.
Если что хочется?
for(const auto & row : table) {
for(const auto & element : row) {
handle(element);
}
}
Это - аналог продукта
Да, product тут не подойдет, но chain - это как сложение списков
edit: ах, тут звездочка: itertools.chain(*table). Тогда да. Правда, с тремя и больше степенями вложенности получится говно
И? Твой код не эквивалентен
?
Ну, вполне себе кандидат в буст, если там такого ещё нет*. Правда, для случая с двумя не связанными последовательностями потребуется хитрый cross join.
*(нужен мне был как-то враппер для контейнера, который поменяет прямые итераторы на обратные, и в бустах такой как раз нашелся :)
Шаблон для произвольного числа range-й тоже реален при использовании variadic templates, но написать будет уже посложнее.
Вообще говоря, я бы писал тупые циклы и не выпендривался.
PS. В языках с list comprehensions это всё есть из коробки:
Python: [y for x in table for y in x]
Haskell: [y | x <- table, y <- x]
из коробки
Там и flatten (view::join), можно, и объединение (view::concat) range-й есть.
Нет такого расширения, сей пост - порождение моего мозга.
Завидую @idkravitz, с нынешним курсом банка сгущенки - это практически целое состояние. Эх.