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

    +1

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    // https://habr.com/ru/post/440388/
    // Интервалы: грядущая эволюция C++ 
    
    // Давайте теперь рассмотрим следующую задачу: имеется вектор, необходимо удалить
    // из него все повторяющиеся элементы. В рамках текущего стандарта мы решали бы её так:
    
    std::vector<T> vec=...;
    std::sort( vec.begin(), vec.end() );
    vec.erase( std::unique( vec.begin(), vec.end() ), vec.end() );
    
    
    // При этом мы указываем имя вектора аж 6 раз! Однако, используя концепцию интервалов
    // (объединив итераторы на начало и конец вектора в один объект), можно написать в разы проще, указав искомый вектор лишь единожды:
    
    tc::unique_inplace( tc::sort(vec) );
    
    //... Че, серьезно? Я так тоже могу:
    // Однако, используя сишный препроцессор™, можно написать в разы проще, указав искомый вектор лишь единожды:
    
    #define DELETE_DUPS(x) do{ std::sort( x.begin(), x.end() ); x.erase( x::unique( x.begin(), x.end() ), x.end() );}while(0)
    
    DELETE_DUPS(vec);

    Тоже мне революция.

    Запостил: j123123, 15 Февраля 2019

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

    • Точнее даже так
      #define DELETE_DUPS(x) do{ std::sort( x.begin(), x.end() ); x.erase( std::unique( x.begin(), x.end() ), x.end() );}while(0)


      Вообще, херня какая-то. Нахер придумывать столько херни?
      Ответить
    • Очередное шаблоноговно на крестах
      https://github.com/ericniebler/range-v3/blob/2ebc6f92d3702111fc5cf328f129163d3dfd3765/include/range/v3/begin_end.hpp


      Даже особые костыли для не самого свежего GCC, чтобы это шаблоноговно заработало. В лучших традициях, так сказать
      #if defined(__GNUC__) && !defined(__clang__) && __GNUC__ >= 8 && __GNUC_MINOR__ < 2
                  // Workaround https://gcc.gnu.org/bugzilla/show_bug.cgi?id=85765
                  template<typename T>
                  void begin(std::initializer_list<T> volatile &) = delete;
                  template<typename T>
                  void begin(std::initializer_list<T> const volatile &) = delete;
      #endif
      Ответить
    • А почему препроцессор, а не шаблон-хелпер?
      Тут не надо ничего возвращать; пердолиться с константными питухами тоже не надо; никаких шаблонов нет (т.е. x - это какой-то обычный тип, нет выражений вида Pitux<int>::pitux = 5, в которых какой-то Pitux имеет kind сложнее, чем "*"). Вроде достаточно самостоятельно написать template<typename T> void unique(T& pitux); и пользоватья.
      Ответить
    • Кстати, а куда потерялся erase? Или unique_inplace сразу обрезает контейнер?
      Ответить
    • Кстати вот интересно, почему в крестах, при всем разнообразии хуйни, пропихиваемой в стандарт, нет банального кольцевого буфера?
      Ответить
      • boost::circular_buffer. Осталось пропихнуть в стандарт.
        Ответить
        • Любую проблему говнокрестов можно решить путём добавления в кресты дополнительной хуйни, кроме проблемы слишком большого количества хуйни в говнокрестах.
          Ответить
          • У нас стало слишком много уровней абстракции? Добавим ещё один, чтобы решить эту проблему.
            Ответить
            • В крестостандарте слишком много хуйни? Добавим еще хуйни, чтобы решить эту проблему.
              Ответить
      • А что, кольцевой буфер - это неебать какая популярная структура? Ты часто ей пользовался?
        Ответить
    • ]a =: ?10#10
      9 5 4 0 9 0 0 7 9 8
         ~.a
      9 5 4 0 7 8
      Ответить
    • > ... Че, серьезно? Я так тоже могу:

      О, бже, ты открыл мне глаза, теперь я тоже могу писать свой код!
      template <typename Container>
      void delete_dups_inplace(Container& c) {
        std::sort(std::begin(c), std::end(c));
        c.erase(std::unique(std::begin(c), std::end(c)));
      }
      
      int main() {
        std::vector nums{1, 2, 2, 3};
        delete_dups_inplace(nums);
      }
      Ответить
      • template <typename Container>
        void delete_dups_inplace(Container& c) {
          std::sort(std::begin(c), std::end(c));
          c.erase(std::unique(std::begin(c), std::end(c)), std::end(c));
        }
        Ответить
    • показать все, что скрытоvanished
      Ответить

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