- 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 не умеем. Да, сегфолт. Да, моё.
Elvenfighter 27.08.2014 23:14 # +2
someone 28.08.2014 08:13 # 0
А вообще забавно, что у std::vector нет метода "удалить первый такой элемент". Даже в Java есть List.remove(Object).
bormand 28.08.2014 08:24 # +3
Выпиливание элемента из вектора по значению - неээфективная хуйня с O(n), как бы намекающая нам на то, что стоило было юзать std::set/std::multiset.
А те, кому это реально надо - поюзают std::find+erase (один) или std::remove+erase (все), не обломаются.
roman-kashitsyn 28.08.2014 09:20 # 0
bormand 28.08.2014 10:09 # 0
А вот range мне и самому хочется.
roman-kashitsyn 28.08.2014 10:21 # +1
Да практически все алгоритмы из стандартной библиотеки нетрудно замутить. Но ведь лень.
Elvenfighter 28.08.2014 15:11 # +4
Велосипедостроительная промышленность? Да там ещё и грабли придётся поворошить. И приправить костылями по вкусу
defecate-plusplus 28.08.2014 11:16 # 0
но, если честно, он мне никогда не казался удобным
roman-kashitsyn 28.08.2014 11:52 # +2
Кмк, проще упаковать всё в одну сущность - последовательность с функциями empty(), size(), front(), back(), pop_front(), pop_back(), и т.п. (в зависимости от концепции).
Да и не было бы проблем с мусором после удаляющих алгоритмов (remove_if, unique и т.п.)
absolut 28.08.2014 22:11 # +2
roman-kashitsyn 01.09.2014 08:20 # +1
Благополучно предано забвению, к счастью. я всегда путался в этих memcpy, мне привычней думать "что копируем - куда копируем".
Да и юниксовые соглашения - первым аргументом у команды всегда идёт то, что уже существует.
wvxvw 01.09.2014 23:45 # 0
Abbath 07.09.2014 02:36 # 0
roman-kashitsyn 08.09.2014 09:32 # 0
Первым аргументом - то, что уже есть, вторым - то, что хотим создать.
3.14159265 08.09.2014 12:35 # 0
>мне привычней думать "что копируем - куда копируем".
>юниксовые соглашения - первым аргументом у команды всегда идёт то, что уже существует
Однако если рассмотреть запись без сайд-эффектов: dest=copy(src);
bormand 08.09.2014 12:42 # 0
Т.е. это не грязное присваивание, а таки чистейшее математическое равенство? Тогда с тем же успехом можно писать copy(src) = dest. Ибо равенство коммутативно.
3.14159265 08.09.2014 12:46 # +2
А если мы декларируем и инициализируем переменную, это тоже считается грязным?
>> без сайд-эффектов
Я кстати не говорил ни о каком "грязном". Для буквоедов речь шла о неявных сайд-эффектах.
Вообще надо смириться с постулатом что в окружающем нас мире нет ничего абсолютно чистого.
bormand 08.09.2014 12:47 # 0
Переменная по определению грязна. Она же переменная, а значит ее значение может меняться.
3.14159265 08.09.2014 12:48 # +2
Таки доебался, а. Вот злодей.
roman-kashitsyn 08.09.2014 13:31 # 0
Хм, если отталкиваться от физических аналогий, то можно рассмотреть процесс переписывания человеком чего-либо в тетрадь.
Мне как-то ближе описание "Вот тебе источник, запиши в тетрадь". Может быть, кому-то проще "вот тебе тетрадь, перепиши в неё из источника".
3.14159265 08.09.2014 13:37 # 0
Пример с юниксом очень убедителен на самом деле.
Почта и циклы, например, тоже используют запись в порядке from-to.
bormand 08.09.2014 13:38 # 0
3.14159265 08.09.2014 13:39 # +1
Смотря в каком.
PS А как записывается FMA?
bormand 08.09.2014 15:13 # 0
bormand 08.09.2014 15:19 # 0
bormand 08.09.2014 15:24 # 0
3.14159265 08.09.2014 16:51 # 0
Вот-вот. На первый взгляд логичнее синтаксис:
mov eax,9; eax=9
add eax,9; eax+=9
Однако гас более подходит под предложение типа: "записать 9 в eax". "Добавить 42 к ebx". И в этом есть смысл: мы же вычисляем сначала правую часть, а потом записываем в левую.
А в если операнды в скобках, то мы должны прочитать самое крайнее выражение.
Порядок вычислений вынуждает нас читать сверху вниз, или справа налево.
Потому ms в linq ввели сахарок, напоминающий cps.
Наверное говно в присваивании и скобках, логичнее так:
9 → eax
f(x) → y
3.14159265 08.09.2014 16:57 # 0
снизу вверх же.
overloop 29.08.2014 19:28 # −1
kegdan 29.08.2014 19:40 # +1
overloop 31.08.2014 20:13 # −1
kegdan 31.08.2014 20:14 # 0
bormand 31.08.2014 20:18 # +1
kegdan 31.08.2014 21:16 # −2
bormand 31.08.2014 20:15 # 0
overloop 31.08.2014 20:44 # 0
bormand 31.08.2014 20:59 # +1
kegdan 31.08.2014 21:24 # 0
bormand 01.09.2014 05:05 # +1
Мда.
kegdan 01.09.2014 05:14 # 0
https://ideone.com/rnd6yV
bormand 01.09.2014 07:39 # +1
А крестоблядские std::remove() и std::remove_if() удаляют любое количество элементов за O(n).
kegdan 01.09.2014 11:11 # −1
Ну и естественно это синтетический пример, я еще не настолько ебанутый что бы так чистить листы
Алсо видел говнопример
- очистите лист
решение
list = new List<SomeShittyType>(list.Count);
bormand 01.09.2014 08:01 # +1
kegdan 01.09.2014 11:45 # 0
roman-kashitsyn 01.09.2014 11:21 # +1
В STL метод erase контейнеров как правило возвращает итератор на следующий итератор. Поэтому можно обойти и очистить контейнер в одном прямом цикле. Буквально вчера юзал такой приём.
TarasB 08.09.2014 16:26 # +2
roman-kashitsyn 08.09.2014 16:32 # +1