Решено: сортиране на vec

Последна актуализация: 09/13/2023
Автор: Rust SourceTrail

Rust, многопарадигмен език за системно програмиране, създаден да осигурява по-добра безопасност на паметта, като същевременно поддържа скорост, е темата на нашето дълбоко гмуркане днес. По-конкретно, ще обсъдим подробно как да сортираме вектор от числа с плаваща запетая (f32) в Rust. Необходимостта и полезността на сортирането на данни не може да бъде надценена, тъй като играе ключова роля в различни приложения, вариращи от база данни и статистика до изчислителна теория. Сортирането на данни е от съществено значение в компютърните технологии, независимо дали филтрирате имейлите си или търсите най-бързия път до дома от работа.

Сортиране на вектор на f32 в Rust

В Rust лесен начин за сортиране на вектор (Vec) от f32 стойности е да използвате метода .sort_by(), заедно с функцията total_cmp от float_ord щайгата. Този метод позволява безопасно и ефективно сортиране на стойности f32.
Първо, трябва да включите касата float_ord във файла `Cargo.toml` на вашия проект, както се вижда по-долу.

[зависимости]
float_ord = “0.2”

Тогава ето един лесен начин за сортиране на Vec:

външна каса float_ord;
използвайте float_ord::FloatOrd;

fn main() {
нека mut nums = vec![FloatOrd(-2.2), FloatOrd(-1.1), FloatOrd(0.0), FloatOrd(1.1), FloatOrd(2.2)];
nums.sort();
нека числа: Vec = nums.iter().map(|n| n.0).collect();
print!(“{:?}”, nums);
}

От пръсти до пета, първият ред декларира използването на ключовата дума `extern` за импортиране на касата float_ord в нашата програма. След това вторият ред пренася структурата `FloatOrd` от кутията `float_ord` в обхват. Наименуваме нашия вектор `nums` и го попълваме с числа.

Подробно обяснение

Горният скрипт започва с импортиране на кутията float_ord, която предоставя обвивка FloatOrd, която позволява общо подреждане и сравнения на равенство за типове с плаваща запетая. От решаващо значение е да използвате тази обвивка, тъй като директните сравнения на стойности с плаваща запетая могат да предизвикат непредвидими резултати поради проблема с NaN (не е число).

В основната функция ние дефинираме променлив Vector nums. Гореспоменатите числа са обвити във функцията FloatOrd(), обвивката, предоставена от кутията float_ord. С тези обвивки на място векторът nums може да бъде сортиран чрез метода `.sort()`.

След това, за да трансформираме нашия вектор обратно към f32, използваме мощната итераторна функция на Rust `iter()`, маркирана с `map()` и `collect()`. Тук „map()“ прилага функция към всеки елемент от вектора.

Свързани функции и библиотеки

Свързана функция в Rust е методът `sort_unstable()`, който обикновено е по-бърз от метода `sort()`, но може да не запази реда на равни елементи. Това може да не е проблем при сортиране на числа, но може да бъде важно при сортиране на структури или двойки.

Функцията `sort_by_key()` е полезна, когато искате да сортирате структури или други сложни типове по определен атрибут. Просто предавате функция, която взема елемент от вектора и връща ключа, по който искате да сортирате.

Стандартната библиотека на Rust, std::cmp, също предоставя две ключови черти, `PartialOrd` и `PartialEq`, за сравняване на екземпляри на тип за сортиране, но те трябва да се използват предпазливо с числа с плаваща запетая поради проблема с NaN.

Накратко, обвивката FloatOrd се справя с това безпокойство, като предоставя общо подреждане и сравнения на равенство за типове с плаваща запетая по безопасен и ефективен начин.

Подобни публикации:

Оставете коментар