- 1
- 2
- 3
- 4
- 5
- 6
- 7
for (conn_vector::iterator i = m_connections.begin(); i != m_connections.end(); ++i) {
if (*i == conn) {
m_connections.erase(i);
toDelete = *i;
break;
}
}
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
+1
for (conn_vector::iterator i = m_connections.begin(); i != m_connections.end(); ++i) {
if (*i == conn) {
m_connections.erase(i);
toDelete = *i;
break;
}
}
Да, С++98. Да, в std::find не умеем. Да, сегфолт. Да, моё.
А вообще забавно, что у std::vector нет метода "удалить первый такой элемент". Даже в Java есть List.remove(Object).
Выпиливание элемента из вектора по значению - неээфективная хуйня с O(n), как бы намекающая нам на то, что стоило было юзать std::set/std::multiset.
А те, кому это реально надо - поюзают std::find+erase (один) или std::remove+erase (все), не обломаются.
А вот range мне и самому хочется.
Да практически все алгоритмы из стандартной библиотеки нетрудно замутить. Но ведь лень.
Велосипедостроительная промышленность? Да там ещё и грабли придётся поворошить. И приправить костылями по вкусу
но, если честно, он мне никогда не казался удобным
Кмк, проще упаковать всё в одну сущность - последовательность с функциями empty(), size(), front(), back(), pop_front(), pop_back(), и т.п. (в зависимости от концепции).
Да и не было бы проблем с мусором после удаляющих алгоритмов (remove_if, unique и т.п.)
Благополучно предано забвению, к счастью. я всегда путался в этих memcpy, мне привычней думать "что копируем - куда копируем".
Да и юниксовые соглашения - первым аргументом у команды всегда идёт то, что уже существует.
Первым аргументом - то, что уже есть, вторым - то, что хотим создать.
>мне привычней думать "что копируем - куда копируем".
>юниксовые соглашения - первым аргументом у команды всегда идёт то, что уже существует
Однако если рассмотреть запись без сайд-эффектов: dest=copy(src);
Т.е. это не грязное присваивание, а таки чистейшее математическое равенство? Тогда с тем же успехом можно писать copy(src) = dest. Ибо равенство коммутативно.
А если мы декларируем и инициализируем переменную, это тоже считается грязным?
>> без сайд-эффектов
Я кстати не говорил ни о каком "грязном". Для буквоедов речь шла о неявных сайд-эффектах.
Вообще надо смириться с постулатом что в окружающем нас мире нет ничего абсолютно чистого.
Переменная по определению грязна. Она же переменная, а значит ее значение может меняться.
Таки доебался, а. Вот злодей.
Хм, если отталкиваться от физических аналогий, то можно рассмотреть процесс переписывания человеком чего-либо в тетрадь.
Мне как-то ближе описание "Вот тебе источник, запиши в тетрадь". Может быть, кому-то проще "вот тебе тетрадь, перепиши в неё из источника".
Пример с юниксом очень убедителен на самом деле.
Почта и циклы, например, тоже используют запись в порядке from-to.
Смотря в каком.
PS А как записывается FMA?
Вот-вот. На первый взгляд логичнее синтаксис:
mov eax,9; eax=9
add eax,9; eax+=9
Однако гас более подходит под предложение типа: "записать 9 в eax". "Добавить 42 к ebx". И в этом есть смысл: мы же вычисляем сначала правую часть, а потом записываем в левую.
А в если операнды в скобках, то мы должны прочитать самое крайнее выражение.
Порядок вычислений вынуждает нас читать сверху вниз, или справа налево.
Потому ms в linq ввели сахарок, напоминающий cps.
Наверное говно в присваивании и скобках, логичнее так:
9 → eax
f(x) → y
снизу вверх же.
Мда.
https://ideone.com/rnd6yV
А крестоблядские std::remove() и std::remove_if() удаляют любое количество элементов за O(n).
Ну и естественно это синтетический пример, я еще не настолько ебанутый что бы так чистить листы
Алсо видел говнопример
- очистите лист
решение
list = new List<SomeShittyType>(list.Count);
В STL метод erase контейнеров как правило возвращает итератор на следующий итератор. Поэтому можно обойти и очистить контейнер в одном прямом цикле. Буквально вчера юзал такой приём.