STL kütüphanesinde kullanılan lambda fonksiyonları, C++11 ile birlikte popüler hale gelmiştir Bu fonksiyonlar, kısa ömürlü anonim işlevlerdir ve kodlama sürecinde anında kullanılabildiğinden oldukça faydalıdır Lambda fonksiyonları, özellikle STL algoritmalarında ve veri yapıları işlevlerinde kullanılır Bu fonksiyonlar, özelleştirilmiş işlevler yazmak için kullanılır ve kullanıcılara özelleştirme ve esneklik sağlar Örneğin, sort gibi algoritmalar kullanarak özel sıralama koşulları belirtilebilir Lambda fonksiyonları, sort fonksiyonu için özelleştirilmiş bir karşılaştırma işlevi sağlar STL algoritmalarında lambda fonksiyonlarının kullanımı oldukça yaygındır ve projelerde kullanmakta sakınca yoktur
![STL'de Lambda Fonksiyonları Kullanımı](/uploads/bloglar3/557828-STL-de-Lambda-Fonksiyonlari-Kullanimi.webp)
STL (Standard Template Library) birçok algoritma, veri yapısı ve konteyner sınıfını içeren üst düzey bir C++ kütüphanesidir. Bu kütüphanede bulunan lambda fonksiyonları, STL ile çalışırken oldukça faydalıdır. Lambda fonksiyonları adı verilen bu işlevler, özellikle C++11'den itibaren büyük bir popülerlik kazanmıştır.
STL'de lambda fonksiyonlarının kullanımı, STL kütüphanesine aşina olanlar için oldukça faydalı olabilir. Lambda fonksiyonları, kısa ömürlü anonim işlevlerdir ve yerel olarak tanımlanır. Bu nedenle, kodlama sürecinde anında kullanılabildiğinden çok kullanışlıdır. Lambda fonksiyonları, STL algoritmalarında ve veri yapıları işlevlerinde kullanılabilir.
Lambda Fonksiyonlarının Tanımlanması
Lambda fonksiyonları, C++ 11'de tanıtılmış isimsiz fonksiyonlardır. İsimsiz fonksiyonların tekniği, bu fonksiyonların bir isim yerine bir değişkene atanarak kullanılmasıdır. Lambda fonksiyonları da aynı şekilde isim yerine atanarak kullanılabilir.
Lambda fonksiyonları, özellikle STL algoritmalarında çok kullanışlıdır. Bir STL algoritması belirli bir işlemi gerçekleştirmek için bir fonksiyon pointerı alır. Lambda fonksiyonları bu işlevi oldukça kolaylaştırır. Fonksiyonun içinde, aynı seviyede olacak şekilde köşeli parantezler oluşturulur.
Örneğin, bir vektördeki sayıları sıralamak istediğimizi varsayalım ve bu sıralama için kendi karşılaştırma fonksiyonumuzu yazmak istiyoruz. Bunun için bir lambda fonksiyonu kullanabiliriz:
|
- İlk olarak, STL sort() işlevi, sıralama işlemi için kullanılan bir alanın başlangıç ve bitiş adreslerini ve bir kıyaslama işlevi gerekir.
- İkinci parametre olarak lambda fonksiyonu kullanılır.
- Şekil içerisindeki ifade, iki sayı karşılaştırıldığında işlemin sonucunu döndüren bir kıyaslama işlevidir.
Bu özellikle, bir STL işlevi çağırmak yerine, kodun kendisi için lambda fonksiyonu yazarak bir işlevi bir başkasına parametre olarak iletmeyi gerektiren durumlarda kullanışlıdır.
STL Algoritmalarında Lambda Fonksiyonlarının Kullanımı
STL algoritmalarında lambda fonksiyonları oldukça yaygın olarak kullanılmaktadır. Bu fonksiyonlar, birçok STL algoritmasında kullanıcılara daha fazla özelleştirme ve esneklik sağlamaktadır.
Örneğin, STL algoritmasında yer alan find_if() işlevi, belirtilen koşulu sağlayan ilk öğeyi bulur ve geri döndürür. Ancak bu koşulu yalnızca kullanıcı belirler. Bu noktada lambda fonksiyonu, kullanıcının bir koşul belirtmesine olanak tanır. Ayrıca STL find_if() işlevi, kullanıcının özelleştirilmiş bir obje veya yapının ilgili üyesinin üzerinde işlem yapmasına da olanak sağlar.
Benzer şekilde, STL sıralama işlevleri üzerinde lambda fonksiyonları kullanarak özelleştirilmiş kıyaslama fonksiyonları belirlenebilir. Bu fonksiyonlar, örneğin tek bir elemana sahip bir struct yapısı içindeki bir özelliği kullanabilecek kadar esnektir.
STL algoritmaları, lambda fonksiyonlarının kullanımına kısıtlama getirmemektedir. Kullanıcılar, belirli koşullar altında lambda fonksiyonlarını kullanarak kendi özelleştirilmiş işlevlerini oluşturabilirler. Bu fonksiyonlar, genellikle uzun koşulları basitleştirmek, kod tekrarını azaltmak ve performansı artırmak için kullanılır.
STL Algoritma İşlevi | Lambda Fonksiyonu Kullanımı |
---|---|
sort() | sort(myVector.begin(), myVector.end(), [](int i, int j) { return i < j; }); |
count_if() | int evenCount = count_if(myList.begin(), myList.end(), [](int i) { return i % 2 == 0; }); |
for_each() | for_each(mySet.begin(), mySet.end(), [](int i) { cout << i << endl; }); |
Bu örnekler, lambda fonksiyonlarının STL algoritmaları ile kullanımına bir örnek olarak gösterilmektedir. Kullanımları ve kompleks projelerde bir avantaj sağlamaları oldukça yaygındır. Bu nedenle, bildiğimiz kadarıyla kullanmakta bir sakınca yoktur ve buna karar vermek için tamamen projemize göre karar veririz.
sort() işlevinde Lambda Fonksiyonunun Kullanımı
STL'nin önemli bir algoritması olan sort() işlevi, belirtilen veri yapısındaki öğeleri sıralama işlemini yapar. Ancak sort() fonksiyonu varsayılan olarak doğru bir şekilde sıralamaz, bu nedenle lambda fonksiyonları kullanarak özel sıralama koşulları belirtebilirsiniz. Lambda fonksiyonları, sort() fonksiyonu için özelleştirilmiş bir karşılaştırma işlevi sağlar.
Örneğin, bir sıralama işlemi sırasında, sort() fonksiyonuna bir lambda fonksiyonu ekleyebilirsiniz. Bu lambda fonksiyonu, sıralama işleminin yapılacağı öğeleri karşılaştırmak için kullanılacaktır. Bu işlev, sort() fonksiyonu tarafından sıralanacak öğelerin veri tipine göre özelleştirilebilir.
Aşağıdaki örnek, bir diziyi küçükten büyüğe sıralamanın örnek kodunu içermektedir:
Kod | Çıktı |
---|---|
int main() { int numbers[] = {2, 1, 4, 3, 5}; int size = sizeof(numbers)/sizeof(numbers[0]); // sort the numbers in ascending order std::sort(numbers, numbers + size, [](int a, int b) { return a < b; }); for(int i = 0; i < size; i++) { std::cout << numbers[i] << " "; } return 0; } | 1 2 3 4 5 |
Bu örnek, sort() işlevinin üç parametresi olan başlangıç, bitiş ve lambda fonksiyonunu kullanır. Lambda fonksiyonu, a ve b parametreleri arasında karşılaştırma yapar ve bir bool değeri döndürür. Bu bool değeri, a ve b'nin doğru sıraya sahip olup olmadığını belirler.
Özelleştirilmiş Kıyaslama Fonksiyonları
STL kütüphanesi, sıralama işlemleri için birçok yerleşik işlev sağlar, ancak uygulama gereksinimleri, üretecinizdeki türleri sıralamak için özelleştirilmiş bir kıyaslama işlevi gerektirebilir. Bu durumda, kullanıcının, özelleştirilmiş bir kıyaslama işlevi tanımlaması ve bu işlevi sıralama işlevine sağlaması gerekir.
Lambda fonksiyonları, özelleştirilmiş kıyaslama işlevleri oluşturmak için oldukça kullanışlıdır. Örneğin, int türünü elemanları olan bir vector sıralamak istiyorsak ve bu sıralamanın tersine olmasını istiyorsak, özelleştirilmiş bir kıyaslama işlevine ihtiyaç duyarız.
Bu durumda, aşağıdaki kod örneği kullanılabilir:
```vector
sort(numbers.begin(), numbers.end(), [](int a, int b) { return a > b;});```
Yukarıdaki kod bloğunda, sort() işlevine geçirilen lambda ifadesi, iki int türü elemanları arasında ters karşılaştırma gerçekleştirir. Böylece, sonuçta, numbers vektörü 12, 8, 7, 5, 2, 1 şeklinde sıralanacaktır.
Bu örnekte kullanılan lambda ifadesi, iki parametresi olan basit bir kıyaslama işlevi içerir. İlk argüman olan 'a' ve ikinci argüman olan 'b', karşılaştırılacak türlerdir. Karşılaştırma işlemi sonucunda, bool türü döndürülür.
Özelleştirilmiş kıyaslama işlevleri, çok çeşitli sıralama ve arama algoritmalarında kullanılabilir ve lambda ifadeleri, STL'nin güçlü yönlerinden biridir.
STL Sıralama (%) Algoritması Çalışma Mantığı
STL (Standard Template Library), sıralama işlemlerinde etkili olan birkaç farklı sıralama algoritması sunar. Bunlardan biri de sıralama (%) algoritmasıdır. Bu sıralama algoritması, sayısal verilerin sıralanması için özellikle etkili bir yöntemdir.
Adım | Açıklama | |
---|---|---|
1 | Ortalama Al | N adet elemana sahip olan sayı dizisi için ilk olarak ortalama bir sayı hesaplanır. |
2 | Ortalama Değerden Sapmaları Hesapla | Dizideki her sayının ortalama değerden ne kadar uzakta olduğu (yani sapması) hesaplanır ve her bir elemandan ortalama değer çıkarılır. |
3 | Karelerin Ortalaması Hesapla | Her bir sapmanın karesi alınarak hesaplanır. Bu değerlerin ortalaması hesaplanır ve bu ortalama karekök alınarak standart sapma elde edilir. |
4 | Istatistiksel Olarak Anlamlı Değer Hesabı | Dizideki her sayı, ortalama değere göre belirli bir mesafede yer alır. Bu mesafe, standart sapmanın kaç katı olduğuna bağlıdır. Standart sapmanın 3 katı kadar olan mesafede yer alan tüm elemanlar, ortalamaya göre kabul edilebilir bir mesafede yer aldığından, bu elemanlar "anlamlı" olarak kabul edilir. Diğer elemanlar, aykırı (outlier) olarak adlandırılır. |
STL sıralama (%) algoritması, bir dizinin istatistiksel olarak anlamlı değerlerini hesaplama işlemi yaptığından, veri analizi işlemlerinde oldukça etkilidir. Bu algoritmanın avantajlarından biri, elde edilen sonuçların daha güvenilir ve daha istatistiksel olarak anlamlı olmasıdır.
for_each() işlevinde Lambda Fonksiyonunun Kullanımı
STL'de lambda fonksiyonları, kod yazarken temel olarak yerel bir fonksiyon gibi kullanılabilen anonim fonksiyonlardır. Bu fonksiyonlar veri kümesinde her bir öğe için çalıştırılabilir. for_each() işlevinde de lambda fonksiyonları kullanılabilir.
for_each() işlevi, STL algoritmalarından biridir ve bir döngü gibi çalışır. Verilen aralıktaki her öğe için lambda fonksiyonu çalıştırır. Bu işlev, bir veri kümesindeki her bir öğeyi belirli bir işlemi uygulayarak değiştirmek veya başka bir amaçla kullanmak için kullanılabilir.
Örnek olarak, aşağıdaki kod parçası bir vektördeki verileri ekrana yazdırmak için for_each() işlevini ve lambda fonksiyonunu kullanır:
#include | ||||
---|---|---|---|---|
int main() | { | std::vector | std::for_each(v.begin(), v.end(), [](int i) {std::cout<< i << std::endl; }); | return 0; |
} |
Bu kod parçası vektördeki her bir öğeyi ekrana yazdırır. İkinci argüman olan lambda fonksiyonu, bu işlemi gerçekleştirir. Fonksiyon, parametre olarak int tipinde bir öğe alır ve bu öğeyi ekrana yazdırır. Bu örnekte for_each() işlevi, lambda fonksiyonunu vecotr'ün her elemanı için çağırır.
Bu örnek, sadece lambda fonksiyonunun ne olduğunu göstermektedir. for_each() işlevi başka amaçlar için de kullanılabilir. for_each() işlevi, STL algoritmalarının diğer birçok işlevi ile birlikte kullanılabilir ve lambda fonksiyonları, bu işlemleri gerçekleştirmek için kullanılabilir.
STL Yığın Veri Yapısında Lambda Fonksiyonları Kullanımı
STL Yığın Veri Yapısı, sıralanmış öğelerin saklanması için kullanılan bir veri yapısıdır. Bu veri yapısı, elemanları heap adı verilen bir ağaç yapısına göre düzenler. Bu şekilde, veri yapısı yine gelecek erişimler için sıralı olarak saklanarak erişimi hızlandırır.
Lambda fonksiyonları, yüksek seviyeli programlama dillerinde sıkça kullanılan bir fonksiyon yöntemidir ve STL Yığın Veri Yapısında da sıkça kullanılır. Lambda fonksiyonları, kısa sürede işlem yapmanızı sağlayan bir fonksiyon yöntemidir.
STL Yığın Veri Yapısında lambda fonksiyonları kullanarak öğelerin sıralı olarak saklanmasını customize edebilirsiniz. Ayrıca, lambda fonksiyonları ile istediğiniz öğeleri Yığına ekleyebilirsiniz.
Bunun yanı sıra, Yığın Veri Yapısında sıklıkla kullanılan işlevlerin çoğu, lambda fonksiyonlarıyla kullanılabilmektedir. Örneğin, en büyük elemanı bulmak için kullanılan max() işlevi, lambda fonksiyonları yardımıyla özelleştirilebilir.
STL Yığın Veri Yapısı, işlevsel programlama yöntemlerinin kullanılması için oldukça uygun bir veri yapısıdır. Lambda fonksiyonları ve bu veri yapısı birlikte kullanılarak, programlama işlemleri kolaylaştırılabilir ve işlemler daha hızlı bir şekilde gerçekleştirilebilir.
Örneğin, STL Yığın Veri Yapısında lambda fonksiyonlarını kullanarak, toplama ya da çarpma işlemleri gibi basit operasyonlar rahatlıkla gerçekleştirilebilir. Bunun yanı sıra, belirli koşulların sağlanmasına göre Yığın Veri Yapısından eleman çıkarılması gibi işlemler de lambda fonksiyonları ile kolayca yapılabilir.
Yığın Veri Yapısı Fonksiyonlarına Lambda İfade Ekleme
STL yığın veri yapısı, öğeleri bir sıraya göre tutan, öncelik veren bir veri yapısıdır. Yığın yapısı girilen elemanların önceliğine ve belirtilen bir kurala göre sıralar. Bu yapının birçok fonksiyonu bulunmaktadır. Bu fonksiyonlara lambda ifadeleri eklenerek işlemler özelleştirilebilir ve verimlilik artırılabilir.
Örneğin, yığın veri yapısında bulunan push() fonksiyonunda bir önceliği olan elemanlar eklenecektir. Ancak, bazı durumlarda eklenmek istenen elemanın özellikleri, yığın yapısında belirtilen öncelik kuralına uygun olmayabilir. Bu durumda, eklenen elemanın özelliklerine göre yığının öncelik kuralı özelleştirilebilir.
Yığın veri yapısı fonksiyonlarına lambda ifade eklemek oldukça kolaydır. Öncelikle, yapılacak işlemin özelleştirilmesi gereken yığın fonksiyonu seçilir. Daha sonra, lambda ifadesi kullanılarak fonksiyonun alacağı argümanlar belirtilir. Bu sayede, yapılan işlem özelleştirilmiş olacaktır.
Örneğin, yığın yapısı içerisindeki bir elemanın özelliklerine göre silme işlemi gerçekleştirilecek olsun. Bu işlem için erase() fonksiyonu kullanılabilir. Ancak, silinecek elemanın belirli bir özelliğe sahip olması gerekiyorsa normal kullanım şekli yeterli olmayabilir. Bu durumda lambda ifadesi kullanarak işlem özelleştirilir. Aşağıdaki örnek kod bloğunda, yığın yapısal fonksiyonu erase() kullanılarak lambda ifadesine sahip bir öncelik kuralı oluşturulmuştur.
std::vectors{ 1, 2, 3, 4, 5 };int to_remove = 2;s.erase(std::remove_if(s.begin(), s.end(), [&](int i){ return i == to_remove; }), s.end());
Bir diğer örnek, yığın yapısında en büyük elemanı bulma işlemidir. Bunun için yığın veri yapısı içerisinde bulunan top() fonksiyonu kullanılır. Ancak, özel bir öncelik kuralına göre en büyük elemanın belirlenmesi gerekiyorsa lambda ifadesi kullanılarak öncelik kuralı belirlenir. Aşağıdaki örnek kod bloğunda, yığın yapısal fonksiyonu top() kullanılarak lambda ifadesine sahip bir öncelik kuralı oluşturulmuştur.
std::priority_queue, decltype(lambda)> pq(lambda);auto lambda = [](int a, int b) { return a < b; };
Yığın yapısı işlemlerini özelleştirmek için lambda ifadeleri oldukça güçlü bir araçtır. Bu ifadeler sayesinde, yığın yapısının verimi artırılabilir ve işlemlerin özelleştirilerek düzenlenebilir.