Кресты / Говнокод #20053 0 12345678910111213141516171819202122232425262728 u_long thisIp = htonl(this->sockaddr.sin_addr.S_un.S_addr); u_long otherIp = htonl(other.sockaddr.sin_addr.S_un.S_addr); u_short thisPort = htons(this->sockaddr.sin_port); u_short otherPort = htons(other.sockaddr.sin_port); // ip1 + port1 < ip2 + port2 if (thisIp < otherIp) { if (thisPort <= otherPort) { return true; } else { return ((unsigned)(thisPort - otherPort) < (unsigned)(otherIp - thisIp)); } } else { if (thisPort >= otherPort) { return false; } else { return ((unsigned)(thisIp - otherIp) < (unsigned)(otherPort - thisPort)); } } Сравнить IPv4 адрес + порт. Т.е., по сути, (thisIP + thisPort) < (otherIP + otherPort). unsigned long long, приди! Запостил: gost, 21.05.2016 (Updated 29.03.2018) Комментарии (23) RSS guest 10 лет ago # 0 Это ст Ответить guest 10 лет ago # 0 ⇈ Тут нет плюсов Ответить kerman 10 лет ago # 0 А зачем? Ответить bormand 10 лет ago # 0 ⇈ Компаратор для дерева/сортировки видимо. Ответить kerman 10 лет ago # 0 ⇈ Ну это понятно... А зачем? В гриде штоле выводить? Ответить gost 10 лет ago # 0 ⇈ Для std::map по типу <address, name>. Ответить kurwa 10 лет ago # 0 ⇈ Так вот где там с++. Ответить gost 10 лет ago # 0 ⇈ >>> this-> Вот же! Ответить bormand 10 лет ago # 0 ⇈ Раньше я бы сказал, что C++ здесь в true. Но пришёл C99 и всё испортил. Ответить Xom94ok 10 лет ago # 0 struct { ip, port } + memcmp Ответить roman-kashitsyn 10 лет ago # 0 ⇈ зависит от endianness? Ответить bormand 10 лет ago # 0 ⇈ Ну для мапа сойдёт. З.Ы. Хотя, если порядок не нужен, проще заюзать хешмап и не париться с operator <... Ответить WGH 10 лет ago # 0 ⇈ А паддинг с говном не помешает? Ответить guest 10 лет ago # 0 ⇈ Пудинг с говном Ответить 3_dar 10 лет ago # 0 this->sockaddr.sin_addr.S_un.S_addr Вот блять почему в С/С++ нельзя называть переменные по нормальному? Ответить j123123 10 лет ago # 0 ⇈ Названия переменных можно локально перегрузить через дефайны Ответить guesto 10 лет ago # 0 ⇈ Это тяжелое наследие берклевых сокетов. Ничето не мешает тебе назвать их SocketAddress Ответить bormand 10 лет ago # 0 ⇈ Причём, скорее всего, этот код и есть подобная обёртка, раз там this->sockaddr. Ответить gost 10 лет ago # 0 ⇈ Да, именно она. Быстровелосипед для быстроутилиты. Ответить defecate-plusplus 10 лет ago # 0 в коде полная чушь если чо порты надо сравнивать только если адреса равны Ответить gost 10 лет ago # 0 ⇈ Блин, то-то меня всё время грызло странное ощущение, что код немного неправильный... Спасибо, добрый человек! Ответить WGH 10 лет ago # 0 Если уж по-крестовому, то проще std::make_tuple(ip1, port1) < std::make_tuple(ip2, port2). Ответить roman-kashitsyn 10 лет ago # 0 ⇈ Мы часто пишем std::tie(ip1, port1) < std::tie(ip2, port2)Если компилять с O2, то производительность примерно как у написанных вручную сравнений, если без оптимизации - примерно на порядок медленнее. Ответить Добавить комментарий Отменить ответ Из-за тебя ушел bormand, guest! А не использовать ли нам bbcode? [b]жирный[/b] — жирный [i]курсив[/i] — курсив [u]подчеркнутый[/u] — подчеркнутый [s]перечеркнутый[/s] — перечеркнутый [blink]мигающий[/blink] — мигающий [color=red]цвет[/color] — цвет (подробнее) [size=20]размер[/size] — размер (подробнее) [code=<language>]some code[/code] (подробнее)
bormand 10 лет ago # 0 ⇈ Раньше я бы сказал, что C++ здесь в true. Но пришёл C99 и всё испортил. Ответить
bormand 10 лет ago # 0 ⇈ Ну для мапа сойдёт. З.Ы. Хотя, если порядок не нужен, проще заюзать хешмап и не париться с operator <... Ответить
3_dar 10 лет ago # 0 this->sockaddr.sin_addr.S_un.S_addr Вот блять почему в С/С++ нельзя называть переменные по нормальному? Ответить
guesto 10 лет ago # 0 ⇈ Это тяжелое наследие берклевых сокетов. Ничето не мешает тебе назвать их SocketAddress Ответить
bormand 10 лет ago # 0 ⇈ Причём, скорее всего, этот код и есть подобная обёртка, раз там this->sockaddr. Ответить
defecate-plusplus 10 лет ago # 0 в коде полная чушь если чо порты надо сравнивать только если адреса равны Ответить
gost 10 лет ago # 0 ⇈ Блин, то-то меня всё время грызло странное ощущение, что код немного неправильный... Спасибо, добрый человек! Ответить
WGH 10 лет ago # 0 Если уж по-крестовому, то проще std::make_tuple(ip1, port1) < std::make_tuple(ip2, port2). Ответить
roman-kashitsyn 10 лет ago # 0 ⇈ Мы часто пишем std::tie(ip1, port1) < std::tie(ip2, port2)Если компилять с O2, то производительность примерно как у написанных вручную сравнений, если без оптимизации - примерно на порядок медленнее. Ответить
Вот же!
З.Ы. Хотя, если порядок не нужен, проще заюзать хешмап и не париться с operator <...
Вот блять почему в С/С++ нельзя называть переменные по нормальному?
Ничето не мешает тебе назвать их SocketAddress
порты надо сравнивать только если адреса равны
Если компилять с O2, то производительность примерно как у написанных вручную сравнений, если без оптимизации - примерно на порядок медленнее.