сортиране, стд

std::алгоритъм за сортиране
Подобно на повечето STL алгоритми, сортирането се дефинира в две форми:
Първата форма на алгоритъма използва функтора за сравнение по подразбиране, докато втората ви позволява да го зададете сами. Нека направим просто сортиране на масиви:
std::sort чрез функция
Сортиране с помощта на нашата собствена функция за сравнение на контейнери:
std::sort + функтор
И ето използването на функтора:
std::sort и сортиране на обекти
И така, как можете да сортирате контейнер от обекти, като използвате алгоритъма за сортиране? Да, всъщност почти същото - малки промени. Да приемем, че имаме клас и контейнер с обекти от този клас:
Ето как можем да сортираме обектите в този масив по местоположението им по оста x:
Сортиране на същия набор от обекти, но по маса:
И, разбира се, нищо не ви пречи да пишете по-сложни функции за сортиране. Например, направете функтор, който ще сортира обектите по маса, а обектите с еднаква маса ще бъдат сортирани по X-координатата:
Нещо като това. Ако имате въпроси - питайте.
в. Готино нещо. Благодаря ти за урока.
в структура struct sort_class_mass_pos
Тази реплика притеснява ли ви? ако (i.m_fMass==j.m_fMass)
Между другото, std::sort често (или почти винаги?) е по-бърза от стандартната функция sort().
И защо изобщо се нуждаете от функтор, с цената на конструктор / деструктор / хранилище, ако можете да зададете функция?
Не е задължително функторът да има тежък конструктор и деструктор (и ако те са празни, тогава разходите обикновено ще бъдат нула). И основното му предимство е, че често може да работи по-бързо. Какво се случва, например, когато извикаме qsort? Плюсовете за всеки две сравнени стойности ги поставят в стека и извикват функцията за сортиране, която посочихме (която е доста бавна). Когато използваме функтор, често (не винаги, но обикновено) компилаторът разбира какво искаме от него (и ние искаме да подредим всичко колкото е възможно повече) и оптимизира съответно. В резултат на това обикновено получаваме забележим тласък (т.е. увеличение на скоростта).
В същото време обикновено си струва същото (не е посочено в статията, но е) да направите функцията за сравнение постоянна, а самите сравнявани променливи, ако не са типове POD, а някои сравнително сложни данни, да се предават като постоянни препратки - това ще помогне на компилатора да разбере по-добре какво се изисква от него.
Можете сами да сравните производителността - например, напишете нещо като относително голям масив (няколко милиона int, например) с обичайния qsort и втората опция със std::sort и отбележете времето за изпълнение и в двата случая - разликата ще бъде много значителна.