1. Куча / Говнокод #17894

    +129

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 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);
        }
    }

    Всякого ненужного говна в новые крестостандарты насовали, а о простых вещах не подумали. Ну ведь удобней же было бы!
    Но не-ет, нам нужна функциональщина в крестах, ведь нам мало мозгоклюйства с другими языками; а давайте засунем в стандартную библиотеку либкайро, чтобы разработчики стандартных библиотек соревновались, кто быстрее запилит частичную поддержку в 95% случаев ненужной либы полутра операционными системами, куда-ах-тах-тах!
    Забавно, только что узнал, что в vs2013 есть шорткат ^ko, который переключает между заголовком и реализацией. ^ko^ko^ko

    Запостил: Xom94ok, 30 Марта 2015

    Комментарии (40) RSS

    • За что же ты крестами в кучу наложил?
      Ответить
    • А потом понадобится делать что-то ещё до обработки каждой строки и после. Да ну нафиг, слишком уж хрупкая конструкция.
      Если уж очень хочется, то можно как-то так:
      for (auto &&element : flatten(table)) {
          handle(element);
      }
      Нужно только написать функцию flatten, которая берёт range однотипных range-й и превращает их в один плоский range.
      Ответить
      • Типа itertools.product?
        Ответить
        • да
          Ответить
          • Загуглил?
            Ответить
            • Ок, открыл доку (у меня локальный поисковик по докам, даже гуглить не надо). Это itertools.chain, а не itertools.product.
              Ответить
              • Аналог какой цпп конструкции это?
                Ответить
                • выражайся яснее, я не умею читать твои мысли.
                  Ответить
                  • >Если уж очень хочется, то можно как-то так:
                    Если что хочется?
                    Ответить
                    • В топике описан обход двумерной таблицы. Первый цикл по строкам, второй - по элементам строки.
                      Ответить
                      • Если вложенный foreach, то аналогом будет именно product
                        Ответить
                        • product - это декартово произведение. Если ты всё же посмотришь в топик, то, возможно, сможешь увидеть, что element проходится по значениям из row. Т.е. элементы всех строк тупо чейнятся, что есть itertools.chain(*table)
                          Ответить
                          • Еще раз: мы о каком сишном коде говорим?

                            for(const auto & row : table) {
                            for(const auto & element : row) {
                            handle(element);
                            }
                            }

                            Это - аналог продукта
                            Ответить
                            • Продукта чего с чем? Напиши мне этот код на пистоне.
                              Ответить
                              • for row in table:
                                    for element in row:
                                        handle(element)

                                Да, product тут не подойдет, но chain - это как сложение списков
                                edit: ах, тут звездочка: itertools.chain(*table). Тогда да. Правда, с тремя и больше степенями вложенности получится говно
                                Ответить
                            • зерна пошурунди.
                              Ответить
      • > Если уж очень хочется, то можно как-то так:
        for (auto &&element : flatten(table)) {
            handle(element);
        }

        Ну, вполне себе кандидат в буст, если там такого ещё нет*. Правда, для случая с двумя не связанными последовательностями потребуется хитрый cross join.
        for(auto x : x_points; auto y : y_points) { use_point(x, y); }

        *(нужен мне был как-то враппер для контейнера, который поменяет прямые итераторы на обратные, и в бустах такой как раз нашелся :)
        Ответить
        • Ну декартово произведение по двум range-ам тоже несложно должно быть построить.

          Шаблон для произвольного числа range-й тоже реален при использовании variadic templates, но написать будет уже посложнее.

          Вообще говоря, я бы писал тупые циклы и не выпендривался.
          PS. В языках с list comprehensions это всё есть из коробки:
          Python: [y for x in table for y in x]
          Haskell: [y | x <- table, y <- x]
          Ответить
      • https://github.com/ericniebler/range-v3
        Там и flatten (view::join), можно, и объединение (view::concat) range-й есть.
        Ответить
    • Вложенный цикол в одну строку? Это что за расширение?
      Ответить
      • papers/2015/h1488.pdf где h значит hamster. Ну ты понял, да?)) hamster, в смысле хомячок, а у меня ник - Xom94ok)), это такая щутка смищная)), а ещё 1488; ну, и тебя с первым апреля, короче.
        Нет такого расширения, сей пост - порождение моего мозга.
        Ответить
      • Банка сгущенки для разума плюсовика #1488
        Ответить
        • > Банка сгущенки для разума плюсовика #1488
          Завидую @idkravitz, с нынешним курсом банка сгущенки - это практически целое состояние. Эх.
          Ответить
    • Развитие идеи:
      for (int y = 0; y < 10; ++y; int x = 0; x < 10; ++x) {
          // ...
      }
      Ответить
      • Заодно решена проблема break из нескольких вложенных циклов :)
        Ответить
        • Сегфолтом можно выйти из бесконечного количества циклов. Редкий сишник этим не пользовался.
          Ответить
    • Говна поешь.
      Ответить
    • 6546546
      Ответить
    • ЁЁЁ
      Ответить
    • ЁЁЁЁЁЁЁ
      Ответить
    • ЁЁЁЁЁЁЁ
      Ответить
    • ЁЁЁЁЁЁЁ
      Ответить
    • илляхби
      Ответить

    Добавить комментарий