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

    +19

    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
    std::vector<int> data;
    std::vector<int> indexes;
    
    // ...
    
    for (int i = 0; i < data.size(); ++i) {
    	if (data[i] == to_remove) {
    		indexes.push_back(i);
    	}
    }
    for (int i = 0; i < indexes.size(); ++i) {
    	data.erase(data.begin() + i);
    }

    "Эффективное" удаление элементов из вектора. Об <algorithm> человек не слышал...

    Запостил: Cpp, 25 Февраля 2013

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

    • Есть похожая картинка:
      http://oi48.tinypic.com/167sgp0.jpg
      Проскакивала на дваче\с\ или нульчане\pr\.
      На ней был указан возраст человека и какие разделы из программирования и особенно функционального нужно изучить. Помню там были паттерны, теория категорий, какие-то там системы типов или типизации различных ученых . Насколько я помню я остановился на середине 2ой картинки. Хочу добить до конца. Киньте ссылку на ту или подобную картинку пожалуйста.
      Ответить
      • >Проскакивала на дваче\с\ или нульчане\pr\.
        И сразу сажа минус.
        Ответить
        • >сажа
          Между прочим на тебя была вся надежда, как на самого там прошаренного в чанах.

          Я ещё вспомнил: на первой картинке молодой парниша с гордостью заявлял: "Я Программист!"
          Ответить
          • >как на самого там прошаренного в чанах.
            Чего? Я туда уже джва вообще не хожу ну если только по ссылкам
            Означенная картинка была и тут.
            > Хочу добить до конца
            Точно помню что герой изучал Coq (настоятельно тебе рекомендую).
            Ответить
            • > Точно помню что герой изучал Coq
              Спасибо за наводку. Нашел эту ссылку на говнокоде, но она к сожалению уже дохлая.
              Ответить
      • http://habrastorage.org/storage2/89f/701/a54/89f701a5458327732ddcc040d8fcb8d8.png
        Ответить
        • Спасибо за попытку помочь. :) Жаль что не та.
          Ответить
          • > Жаль что не та
            Потому и зеленым. Я понял примерно о какой картинке речь, но загуглить ее не смог.
            Ответить
            • Мне тут подкинули, но кажется это не она, так как там список технологий был больше или я уже все просто забыл
              http://0chan.hk/c/src/13618240946852.jpg

              http://0chan.hk/c/res/20282.html

              -подкинули тут.
              Ответить
              • Я не ошибся в этом ресурсе.
                История успеха из ссылки выше:
                1. Когда мне было 16 лет, я знал ZX Basic и Z80 Assembler. Дрочил, понятное дело, на асм, был эталонный байтоёб.
                2. Когда мне было 20 лет, я знал Turbo Pascal и x86 Assembler. Дрочил на баб.
                3. Когда мне было 25 лет, я знал Java (ещё немного запомоился о C++ и PHP), и бабы дрочили на меня.
                4. Когда мне было 30 лет, я знал Java и Scheme. Дрочил на Scheme. Ну, это понять нетрудно: захотелось синтаксической экзотики без серьёзных отношений.
                5. Сейчас мне дохуя лет, я знаю Java и дрочу на Haskell. В менеджеры идти не хочу, презираю их за трусость, некомпетентность и лицемерие. Коллеги спиваются, но Haskell изучать не хотят.
                Ответить
    • Жирнейший плюсище. Видел что-то очень похожее, только с двумя списками указателей. До сих пор дергается глаз при упоминании того проекта.
      Ответить
    • > Об <algorithm> человек не слышал...

      что именно в алгоритмах есть такого что облегчает задачу удаления из вектора?

      кроме какого copy_if() ничего в голову не приходит.
      Ответить
      • remove_if же
        классическое использование с container.end()) container.end() в одной одной конструкции для тех кто с первого первого раза плохо понимает
        Ответить
        • > remove_if же
          Зачем remove_if()? Тут же по значению удаляют, не по сложному условию. Просто remove().
          Ответить
          • Я вообще ожидал в последнем цикле нечто такое:
            for (int i = 0; i < indexes.size(); ++i) {
               data.erase(data.begin() + indexes[i]);
            }
            Ответить
            • Да, действительно, писал по памяти и опечатался.
              Ответить
      • auto first_to_remove = std::remove(data.begin(), data.end(), to_remove);
        data.erase(first_to_remove, data.end());
        Ответить
        • В с++98 приходится писать в одну строку ;(
          Ответить
          • Я в своих старых проектах использовал такую обертку:
            template <typename TContainer, typename TElement>
            void Remove(TContainer &container, const TElement &value) {
            	typedef TContainer::iterator iterator;
            
            	iterator begin = container.begin();
            	iterator end = container.end();
            	iterator first_to_remove = std::remove(begin, end, value);
            
            	container.erase(first_to_remove, end);
            }}
            Ответить
            • >TContainer &container
              Фу... мутабильный контейнер. Поступай как функцианальщики: Создай новый контейнер и скопируй туда через std::copy_if.
              Ответить
              • Не вижу ничего плохого в мутабельных контейнерах. А если нет возможности создать новый контейнер? Например, программа работает в условиях с жескими ограничениями по оперативной памяти. Недавно на работе столкнулся с такой ситуацией, уменьшал количество аллокаций и фрагментацию памяти, из-за постоянно выскакивающих bad_alloc на старых компах.
                Ответить
            • А где typename после typedef? и скобка в конце лишняя
              Ответить
              • Вообще, да, typename нужен. Но раньше у меня его там не было :)
                Ответить
    • Это случаем не поиск кратчайшего пути по Алгоритму Дейкстры? Встречал что-то подобное, и пришлось уйти от <algorithm> по причине того, что скрипт использовался как CGI скрипт на сайте, и линуксовый компилятор не понимал <algorithm>, поэтому пришлось уйти от него и от неймспейса std (не помню по какой причине). На даже с этим обилием муторных циклов скрипт выполнялся в сотни раз быстрее, чем аналогинчый на PHP (0.06 сек на С++ CGI, от 6 до 16 секунд на PHP).
      Ответить

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