1. C++ / Говнокод #27450

    0

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    int main(void)
    {
        std::string data = "HELLO WORLD!\n";
        std::transform(
            data.begin(), data.end(), 
            std::ostream_iterator<char>(std::cout, ""),
        std::bind(std::plus<char>(), std::placeholders::_1, 1));
        
        return 0;
    }

    А как сделать это ещё короче?

    Запостил: digitalEugene, 02 Июня 2021

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

    • std::cout << data?

      А bind можно попробовать на лямбду поменять. Вроде нагляднее будет.
      Ответить
    • Экономим на спичках:

      int main(void) → int main()

      C++14:
      std::plus<char>() → std::plus<>{}

      std::string data = "HELLO WORLD!\n"; → auto data = "HELLO WORLD!\n"s;

      C++20:
      std::transform(data.begin(), data.end(), → std::ranges::transform(data,
      Ответить
      • std::bind(std::plus<char>(), std::placeholders::_1, 1) -> [](char c) { return c + 1; }

        bind ня нужен.
        Ответить
        • bind нужен для того, чтобы объяснить, что такое bind
          Ответить
        • > bind ня нужен

          Кстати, только сегод-ня узнала, что bind не контролирует количество аргументов и тупо отбрасывает лишнее:
          auto b = std::bind(std::plus<char>(), std::placeholders::_1, 1);
          std::cout << b(42, 100500, "foobar") << std::end;
          Опасная штука. Зачем они так?
          Ответить
          • А ещё эта штуковина ломается от ссылок.
            void to_upper(std::string & str)
            {
                for (auto & c : str) {
                    c = static_cast<char>(std::toupper(c));
                }
            }
            
            int main()
            {
                std::string str = "hello world";
                auto f = std::bind(to_upper, str);
                f();
                std::cout << "str = " << str << std::endl;
            }
            Ответить
      • Если неймспейсы всякие не учитывать то вообще коротко.
        int main()
        {
            ranges::transform("HELLO WORLD!\n"s,ostream_iterator<char>(cout,""),bind(plus<>{},_1,1));
            return 0;
        }
        Ответить
    • Блин, как всё-таки отступы влияют на чтение кода... Постоянно кажется, что строка 7 это новый стейтмент, а не продолжение 4-6.
      Ответить

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