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

    +19

    1. 1
    2. 2
    3. 3
    boost::unordered::unordered_set<const WindowName> _windowNameSet;
    //...
    return (std::find(_windowNameSet.begin(),_windowNameSet.end(), Name) != _windowNameSet.end());

    Запостил: laMer007, 25 Декабря 2013

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

    • Ответить
    • _windowNameSet.find(Name) != _windowNameSet.end() ?
      Ответить
      • Само по себе условие какое то странное.
        Ответить
        • Банальная проверка на существование имени окна в хешсете.
          Ответить
          • А с чем связана проверка != _windowNameSet.end()? Всмысле Find возвращает адрес памяти?
            Ответить
            • > адрес памяти
              Итератор.

              > _windowNameSet.end()
              Пустой итератор.
              Ответить
            • STL … It’s also something that, when you first encounter it, makes you wonder what the hell the designer was smoking. And once you’ve gotten used to it, you start wondering why other library designers don’t start smoking the same thing.
              Ответить
          • неправильня мысль.
            Ответить
            • мне или показалоь или нет, но Это возвращает имя, если имя находится не в конце сета.
              Ответить
              • http://www.boost.org/doc/libs/1_51_0/doc/html/boost/unordered_set.html#id1746104-bb

                Returns:
                An iterator pointing to an element with key equivalent to k, or b.end() if no such element exists.

                А end указывает на Великое Ничто, которое находится в конце почти каждой коллекции.
                Ответить
                • > Великое Ничто, которое находится в конце почти каждой коллекции.
                  > в конце
                  И в начале тоже. Иначе бы std::reverse_iterator бы не работал.
                  Ответить
                • > Великое Ничто, которое находится в конце почти каждой коллекции
                  Великое Ничто, имхо, расположено не в конце коллекции, а вокруг нее :)
                  Ответить
                  • И драконы ещё живут там.
                    Ответить
                  • > не в конце коллекции, а вокруг нее :)
                    Не во всех колекциях
                    Ответить
                    • не во всех концах
                      Ответить
                      • Для forward-коллекций обычно gap в начале коллекции нет.
                        Ответить
                    • А в каких end() указывает на элемент, который есть внутри коллекции?
                      Ответить
                      • PugiXML (итератор по нодам узла дерева и атрибутам)
                        Ответить
            • > неправильня мысль.
              Не учи отца ебаться ;)

              > не в конце сета
              И где же расположен конец unordered сета, и когда он настанет? :)
              Ответить
              • > unordered
                но ведь begin(), end(), итераторы...
                http://s.pikabu.ru/images/big_size_comm/2013-12_1/13860361151354.jpg
                Ответить
                • Ну да, у него есть begin() и end(), но итератор unordered_set'а оббегает его в хрен-бы-знал-каком порядке. Поэтому выражение "элемент, лежащий в конце сета" не имеет смысла. Там может оказазаться совершенно любой элемент, смотря как хеш ляжет.
                  Ответить
                  • смысл ясен), там нету расположения по порядку.
                    просто я его представил себе как список.
                    Ответить
              • > неправильня мысль.
                Не учи отца ебаться ;)

                не ,я написал спорное утверждение, которое потом поменял на "неправильня мысль", и получился такой казус).
                Ответить
        • если кажется странным , перекерестись, язык обязывает)
          Ответить
      • std::find делает поиск ключа в set за O(n).
        Ответить
        • Угу, а _windowNameSet.find(Name) за O(1).
          Ответить
          • А простого _windowNameSet.Contains(Name) нет?
            Ответить
            • Нед. А зачем? Чтобы народ сдуру писал сначала contains а потом какой-нибудь find?
              auto it = someMap.find(key);
              if (it != someMap.end()) {
                  // делаем что-то с it->second
              } else {
                  // не нашли
              }
              Ответить
              • Можно унаследоваться от нужного контейнера написать макрос CONTAINS и успешно использовать его перед find.
                Если повезёт, можно ещё и контейнер пару раз вычислить, ядер нынче много.
                Ответить
                • > макрос
                  Фубля. Есть же кавайные шаблоны:
                  template <typename C, typename K> bool contains(C container, K key) {
                      return container.find(key) != container.end();
                  }
                  Ответить
                  • Ой, что за хуйню я тут понаписал. const C & container и const K & key конечно же. Простите сонного дурака за копирование контейнера ;)
                    Ответить
                    • Ещё inline добавить нужно. И пох, что в 90% случаев его проигнорят.
                      Ответить
                      • > И пох, что в 90% случаев его проигнорят.
                        В 90% случаев проигнорят его отсутствие и заинлайнят ;)
                        Ответить
                        • Собственно я и имел в виду, что его наличие или отсутствие на поведение компиляторов влияет редко.
                          Ответить
                      • inline добавлять не нужно. Шаблоны функций подразумевают inline, ни один нормальный компилятор не будет тут ругаться на нарушение ODR.
                        Ответить
                    • Я и забыл, что так можно. Хотел унаследоваться, потом понял, что это много кода с параметрами шаблонов (больше, чем при добавлении своего метода в руби или жс) и много проблем. А тут... кратко, универсально и без макросопроблем.
                      Ответить
                    • крестопроблемы
                      в Аде const& - это модификатор по умолчанию

                      правка: я оюсь, что однажды меня удут вычислять по западающей на клавиатуре кнопке ""
                      Ответить
                      • > в Аде const& - это модификатор по умолчанию
                        И это хорошо. В крестах тоже бы не помешало.
                        Ответить
                        • > И это хорошо. В крестах тоже бы не помешало.

                          Обратная совместимость с сишкой же.

                          Не уверен на 100%, что даже вездесущий const по умолчанию был бы хорошим решением... Опять же, обратная совместимость.
                          Ответить
                          • Обратная совместимость - это вообще большой пиздец крестов.
                            Просто переписать их как есть, но с нормальным синтаксисом и модульностью - уже будет намного лучше. Хотя не, такой язык уже есть...
                            Ответить
                            • О чем вы говорите?) Какая обратная совместимость?)
                              Ответить
                            • > Хотя не, такой язык уже есть...

                              И он никому не нужен. Чувствуешь подвох?
                              Ответить
                              • Чую. Самое хреновое это то, что ненужность языка - это порочный круг. На нём никто не хочет писать из-за отсутствия инфраструктуры (т.е. из-за того, что на нём никто не пишет). При этом если язык популярный, то со временем он обрастает говном и костылями.
                                Короче, мы обречены.
                                Но лучше иногда делать глобальную шоковую терапию. От Фортрана и Кобола же отошли как-то? Вот и сейчас.
                                Ответить
                                • Cейчас все сходится к универсальным языко-независимым инфраструктурам вроде .NET и jvm (и llvm?) с наследованием тормозов и костылей.

                                  Некоторые верят в успешность языков вроде Rust и Clay.
                                  Ответить
                                  • llvm это хорошая замена сишке как языка низкого уровня - кроссплатформенный ассемблер без лишних костылей.
                                    Понятно, что писать на нём руками не надо.
                                    С высоким уровнем сложнее, потому если язык предназначен для человека, то ему, как минимум, нужна нормальная среда, то есть зоопарк велосипедов, радостно паразитирующих на ллвм, отпадает, при этом опять же что-то новое придумать и раскрутить по-прежнему тяжело.
                                    Ответить
                                  • Rust няша. А что там с Clay?
                                    Ответить
                            • Обратная совместимость - это и дар, и проклятие.
                              Взять хотя бы питон 3. 10 лет прошло с выхода новой версии, а попоболь всё не утихает.
                              Ответить
                  • template <class C, class K> bool contains(this const C& container, const K& key) {
                        return container.find(key) != container.end();
                    }
                    Ответить
                    • Хм, в каком стандарте крестов появится this (extension методы как в шарпе)?
                      Ответить
                      • Я подписывался на мэйл-рассылку стандарт и заторов C++. Ни разу не упомянули про экстеншен методы в крестах. Так что видимо уже никогда. Фича шарпа не впечатлила народ
                        Ответить
                        • Сахар же. Чтоб писать CPS-like цепочки через точку.
                          Ответить
                          • > Сахар же.
                            Ну да, ничего нового не дает. Да еще и запутывает, создавая впечатление, что это метод объекта, а не тупая внешняя функция.
                            Ответить
                            • Дык ООП головного мозга не позволило запилить нормальные функции, не привязанные к классам, а не костыли с виде статических методов класса
                              Ответить
                              • Цепочку обычных функций читают справа налево. А цепочку эктеншн методов, в привычном порядке, слева направо. Видимо ради этого...
                                Ответить
                • #define CONTAINS find
                  Ответить
              • и то верно
                Ответить
    • - Давай-ка задом, мила, - я шлёпнул Елену по ляжке, и она неловко перевернулась, встала на колени, высоко подняла зад.
      Ответить

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