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

    +72

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    7. 7
    auto val = map_.at(std::distance(map_.begin(),
    	std::min_element(map_.begin(), map_.end(), [](std::vector<int> a, std::vector<int> b)
    	{
    		return b.at(std::distance(b.begin(), std::min_element(b.begin(), b.end()))) > a.at(std::distance(a.begin(), std::min_element(a.begin(), a.end())));
    	})));
    
    return val.at(std::distance(val.begin(), std::min_element(val.begin(), val.end())));

    Разыменование итератора для слабаков!

    Запостил: runewalsh, 18 Апреля 2014

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

    • и эти люди смеют кукарекать на хачкель
      Ответить
    • >std::vector<int> a, std::vector<int> b
      говно
      еще и вектор копируется
      Ответить
      • Слона то я и не заметил...

        Кстати, а как оно так лихо оббегает map? Там же std::pair<K, V> должны сыпаться, а не тупо значения...

        Или map_ совсем не мап, а std::vector<std::vector<int>>?
        Ответить
        • > Или map_ совсем не мап, а std::vector<std::vector<int>>?
          Да, это должен быть вектор векторов
          Ответить
    • Поиск минимального элемента в std::map<???, std::vector<int>>?

      P.S. Эту хрень надо гонять на связном списке... На векторе она все-таки не будет лагать :)
      Ответить
    • похоже на поиск седлового элемента в матрице, но точно не уверен
      Ответить
      • Не, просто минимального. У седлового все-таки min/max или max/min, а тут min/min...

        P.S. Я бы написал это тупо двумя for'ами. Имхо так проще и понятней в данном случае, чем все эти крестоФВП...
        Ответить
        • Да, точно. Поиск минимума в векторе векторов. Эпично.
          Ответить
        • > Я бы написал это тупо двумя for'ами
          если только минимум искать, то я бы тоже. Если бы ещё что-то нужно делать со всеми элементами матрицы, написал бы какой-нибудь flattening_iterator, чтобы стандартные алгоритмы переиспользовать.
          Ответить
          • > написал бы какой-нибудь flattening_iterator

            а че в бусте ничего такого нету?
            Ответить
        • > Я бы написал это тупо двумя for'ами
          И как?
          Ответить
          • Ну вот так например:
            int min_element(const std::vector<std::vector<int>> map) {
                int min;
                bool first = true;
                for (auto &v : map) {
                    for (auto &x : v) {
                        if (first) {
                            first = false;
                            min = x;
                        } else if (x < min) {
                            min = x;
                        }
                    }
                }
                if (first)
                    throw ...;
                return min;
            }
            Ответить
            • кидать из алгоритма? жестокий ты человек...
              p.s. референс в сигнатуре отклеился
              Ответить
              • > жестокий ты человек...
                А нефиг в пустых массивах искать минимум :)

                > p.s. референс в сигнатуре отклеился
                Упс.
                Ответить
                • > А нефиг в пустых массивах искать минимум :)
                  как минимум LLVM и Clang собираются без поддержки RTTI и (соответственно) исключений.
                  Ответить
                  • > как минимум LLVM и Clang собираются без поддержки RTTI и (соответственно) исключений.
                    О как... Ну тогда придется мутить матричный итератор. С ним и на фейл легко проверить, и что-нибудь сделать с элементом можно будет... Ну и куча копирований убирается, мало ли, чего там в этом T было.
                    Ответить
                    • я понял истинную логичность stl только когда начал писать свои алгоритмы, структуры данных и итераторы :)

                      Правда, иногда и в stl попадаются очевидные фейлы. Один equal чего стоит.
                      Ответить
                  • Кстати, в коде LLVM есть свой велосипедистый RTTI, причем программисту нужно самому определять enum'ы с типами, методы classof и, возможно, что-то ещё (я особо не копался).
                    http://llvm.org/docs/HowToSetUpLLVMStyleRTTI.html
                    Ответить
                  • Походу вспомнилась реализация исключений на основе setjmp/longjmp

                    www.rsdn.ru/article/pda/symbian.xml
                    Ответить
            • >const std::vector<std::vector<int>> map
              boost::ublas::matrix
              Ответить
          • тут даже одного for достаточно
            шаблоны допишешь сам
            // http://ideone.com/J70B4c
            typedef std::vector<int> row;
            typedef std::vector<row> matrix;
            
            bool min_matrix_element(const matrix &m, int &target)
            {
                bool found = false;
                for (const auto &r : m) {
                    auto end = std::end(r);
                    auto me = std::min_element(std::begin(r), end);
                    if (me != end) {
                        target = found ? std::min(target, *me) : *me;
                        found = true;
                    }
                }
            
                return found;
            }
            Ответить

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