Lambda ile Sıralama
Coddy'nin C++ Journey'sinin Mantık & Akış bölümünün bir parçası — ders 47 / 56.
C++ Standart Kütüphanesi, <algorithm> başlığından, vektörler gibi konteynerleri sıralayabilen std::sort adında güçlü bir fonksiyon sağlar.
Varsayılan olarak, std::sort öğeleri artan düzende (küçükten büyüğe) sıralar. Ancak, öğelerin nasıl karşılaştırılacağını tanımlayan bir lambda ifadesi sağlayarak bu davranışı özelleştirebilirsiniz:
#include <vector>
#include <algorithm>
std::vector<int> numbers = {5, 2, 8, 1, 9};
// Bir lambda kullanarak azalan düzende sırala
std::sort(numbers.begin(), numbers.end(), [](int a, int b) {
return a > b; // Eğer a, b'den önce gelmeliyse true döndür
});Lambda, karşılaştırılan öğeleri temsil eden iki parametre alır ve sıralanan sonuçta ilk öğe ikinciden önce gelmeliyse true döndürür. Azalan sıralama için, büyük sayıları başa yerleştiren a > b durumunda true döndürürüz.
Bu, lambdaların ayrı karşılaştırma fonksiyonları yazmanıza gerek kalmadan standart kütüphane fonksiyonlarını özelleştirmeyi nasıl kolaylaştırdığını ve sıralama mantığınızı tam olarak ihtiyaç duyduğunuz yerde tutmanızı sağladığını gösterir.
Görev
Kolaystd::sort ile lambda ifadelerini kullanarak özel sıralama yapan bir program oluşturun. Bu görev, sıralama konteynerleri için özel karşılaştırma mantığı tanımlamak amacıyla lambda fonksiyonlarını nasıl kullanacağınızı anlama düzeyinizi test edecektir.
Aşağıdaki girdiler sağlanacaktır:
- Vektördeki eleman sayısını temsil eden bir tam sayı
n - Sıralanacak elemanları temsil eden
nadet tam sayı - Sıralama düzenini temsil eden bir karakter
order(artan düzen içinA, azalan düzen içinD)
Programınız şunları yapmalıdır:
- Bir
std::vector<int>oluşturun ve bunu girdi sayılarıyla doldurun - Vektörü sıralamak için
<algorithm>başlığındakistd::sortfonksiyonunu bir lambda ifadesiyle birlikte kullanın - Lambda, iki tam sayı parametresi almalı ve bir boolean değer döndürmelidir
- Sıralama karakterine bağlı olarak, lambada uygun karşılaştırma mantığını uygulayın
- Sıralanan vektörün her bir elemanını ayrı bir satıra yazdırın
Sıralama davranışı şu şekilde olmalıdır:
- Eğer
orderdeğeriAise: artan düzende sıralayın (küçükten büyüğe) - Eğer
orderdeğeriDise: azalan düzende sıralayın (büyükten küçüğe)
Aşağıdaki tam çıktı formatını kullanın:
[first_sorted_element]
[second_sorted_element]
...
[last_sorted_element]std::sort fonksiyonunun üç parametre aldığını unutmayın: başlangıç yineleyicisi (iterator), bitiş yineleyicisi ve bir karşılaştırma fonksiyonu. Yineleyiciler için vector.begin() ve vector.end() kullanın. Lambda karşılaştırma fonksiyonu, sıralanan sonuçta ilk parametrenin ikinci parametreden önce gelmesi gerekiyorsa true döndürmelidir. Artan düzen için a < b; azalan düzen için a > b döndürün.
Kopya kağıdı
<algorithm> başlığındaki std::sort fonksiyonu, vektörler gibi kapsayıcıları sıralar. Varsayılan olarak artan düzende sıralar, ancak bir lambda ifadesi kullanarak sıralama davranışını özelleştirebilirsiniz.
Temel sözdizimi:
std::sort(container.begin(), container.end(), comparison_lambda);Lambda, karşılaştırılan öğeleri temsil eden iki parametre alır ve sıralanan sonuçta ilk öğenin ikinciden önce gelmesi gerekiyorsa true değerini döndürür.
Örnek - azalan düzen:
#include <algorithm>
#include <vector>
std::vector<int> numbers = {5, 2, 8, 1, 9};
std::sort(numbers.begin(), numbers.end(), [](int a, int b) {
return a > b; // Daha büyük sayılar önce gelir
});Örnek - artan düzen:
std::sort(numbers.begin(), numbers.end(), [](int a, int b) {
return a < b; // Daha küçük sayılar önce gelir
});Kendin dene
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
// Girdiyi oku
int n;
cin >> n;
vector<int> numbers(n);
for (int i = 0; i < n; i++) {
cin >> numbers[i];
}
char order;
cin >> order;
// TODO: Kodunuzu aşağıya yazın
// Vektörü sıralama karakterine göre (artan için A, azalan için D)
// sıralamak için bir lambda ifadesiyle std::sort kullanın
// Sıralanmış öğeleri yazdır
for (int num : numbers) {
cout << num << endl;
}
return 0;
}Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Mantık & Akış bölümündeki tüm dersler
1İşaretçiler ve Bellek
İşaretçi Nedir?Adres OperatörüDereference OperatörüNull İşaretçilerİşaretçiler ve Diziler'new' ile Dinamik Bellek'delete' ile Belleği Serbest BırakmaÖzet - İşaretçi Pratiği4Map'ler (Anahtar-Değer Çiftleri)
std::map'e GirişBir Map OluşturmaDeğerlere Erişme ve DeğiştirmeAnahtar KontrolüÇiftleri KaldırmaMap Üzerinde YinelemeÖzet - Kelime Frekansı7İleri Seviye Fonksiyonlar
Referans ile GeçmeLambda İfadelerine GirişParametreli LambdalarDönüş Değeri Olan LambdalarÖzyinelemeye GirişÖzyinelemeli FaktöriyelLambda ile Sıralama2Vektörler (Dinamik Diziler)
std::vector'a GirişBir Vektör OluşturmaEleman EklemeElemanlara ErişmeVektör BoyutuFor Döngüsü ile YinelemeAralık Tabanlı For DöngüsüEleman SilmeÖzet - Vektör İşlemleri3Proje: Görev Listesi Aracı
Projeye Genel BakışGörev Ekleme