algorithms stl
STL'de Algoritmalar ve Türlerinin Açık Bir Çalışması.
youtube'u mp4 yüksek kaliteye dönüştür
STL, yineleyiciler aracılığıyla konteynerler üzerinde hareket eden çeşitli algoritmaları destekler. Bu algoritmalar doğrudan kapsayıcılar üzerinde değil yineleyiciler üzerinde hareket ettiğinden, her tür yineleyicide kullanılabilirler.
STL algoritmaları yerleşiktir ve bu nedenle çok zaman kazandırır ve daha güvenilirdir. Ayrıca kodun yeniden kullanılabilirliğini de geliştirirler. Bu algoritmalar normalde yalnızca bir işlev çağrısıdır ve bunları uygulamak için kapsamlı kod yazmamız gerekmez.
=> Tüm C ++ Eğitim Serisini Burada Arayın.
Ne öğreneceksin:
STL Algoritma Türleri
STL, aşağıdaki algoritma türlerini destekler
- Arama algoritmaları
- Algoritmaları Sıralama
- Sayısal algoritmalar
- Dönüştürmeyen / Değiştirmeyen algoritmalar
- Algoritmaları dönüştürme / değiştirme
- Minimum ve Maksimum işlemler
Bu türlerin her birini aşağıdaki paragraflarda ayrıntılı olarak tartışacağız.
Algoritmaları Ara ve Sırala
STL'de öne çıkan arama algoritması ikili aramadır. İkili arama algoritması sıralanmış bir dizi üzerinde çalışır ve diziyi ikiye bölerek elemanı arar.
Bu, önce aranacak öğeyi dizinin orta elemanıyla karşılaştırarak ve ardından aramayı 1 ile sınırlayarak yapılır.styarım veya 2ndDizinin yarısı, aranacak elemanın ortadaki elemandan küçük veya büyük olmasına bağlı olarak değişir.
İkili arama, en yaygın kullanılan arama algoritmalarıdır.
Genel sözdizimi şöyledir:
binary_search(startaddr, endaddr, key) Nerede,
startaddr: dizinin ilk elemanının adresi.
endaddr: dizinin son elemanının adresi.
anahtar: aranacak öğe.
STL, bir kaptaki öğeleri belirli bir sıraya göre düzenlemek için kullanılan bir 'Sıralama' algoritması sağlar.
Sıralama algoritmasının Genel Sözdizimi:
sort(startAddr, endAddr); Nerede,
startAddr: sıralanacak dizinin başlangıç adresi.
endAddr: sıralanacak dizinin bitiş adresi.
Dahili olarak STL, diziyi sıralamak için Quicksort algoritmasını kullanır.
İkili arama ve sıralama algoritmasını göstermek için bir örnek verelim:
#include #include using namespace std; int main() { int testAry() = { 1, 5, 8, 9, 6, 7, 3, 4, 2, 0 }; int arysize = sizeof(testAry) / sizeof(testAry(0)); sort(testAry, testAry + arysize); cout<<'
Sorted Array is
'; for(int i=0;i Çıktı:
Sıralanmış Dizi:
0 1 2 3 4 5 6 7 8 9
Dizide bulunan anahtar = 2
Dizide anahtar = 10 bulunamadı
Verilen kodda, ikili aramayı kullanarak bir anahtar elemanı aramamız gereken bir dizi sağladık. İkili arama sıralı bir dizi gerektirdiğinden, diziyi önce 'sıralama' algoritmasını kullanarak sıralarız ve ardından gerekli parametreleri sağlayarak 'binary_search' için bir işlev çağrısı yaparız.
İlk olarak, binary_search algoritmasını key = 2 ve ardından key = 10 için çağırıyoruz. Bu şekilde, tek bir işlev çağrısı ile bir dizi üzerinde uygun bir şekilde ikili arama yapabilir veya sıralayabiliriz.
Sayısal Algoritmalar
STL'deki başlık, Sayısal değerler üzerinde çalışan çeşitli işlevleri içerir. Bu işlevler, lcds, gcds bulmaktan diziler, belirli bir aralıktaki vektörler gibi bir kaptaki öğelerin toplamını hesaplamaya kadar değişir.
Burada birkaç önemli işlevi örneklerle tartışacağız.
(i) biriktirmek
Biriktirme işlevinin genel sözdizimi şöyledir:
accumulate (first, last, sum); Bu işlev, bir değişken toplamındaki bir aralıktaki (ilk, son) tüm öğelerin toplamını döndürür. Yukarıdaki sözdizimi gösteriminde, ilk ve son, bir kaptaki ilk ve son elemanların adresleridir ve toplam, toplam değişkeninin başlangıç değeridir.
(ii) kısmi_toplam
Kısmi_toplam işlevinin genel sözdizimi şöyledir:
partial_sum(first, last, b) Buraya
ilk: konteynerin başlangıç öğesinin adresi.
Son: konteynerin son öğesinin adresi.
B: Karşılık gelen dizi öğelerinin kısmi toplamının depolanacağı dizi.
Böylece kısmi_toplam işlevi, karşılık gelen dizinin veya vektör öğelerinin kısmi toplamını hesaplar ve bunları farklı bir dizide saklar.
A, (ilk, son) aralığındaki öğeyi temsil ediyorsa ve b sonuçtaki dizideki öğeyi temsil ediyorsa, kısmi_toplam şöyle olacaktır:
b0 = a0
b1 = a0 + a1
b2 = a0 + a1 + a2… vb.
Her ikisini de göstermek için bir örnek görelim. Bir programdaki bu işlevler:
#include #include using namespace std; int main() { int A() = {21,25,64,32}; int sum = 0; int b(4); cout<<'
Result of accumulate function is: '< Çıktı:
Biriktirme işlevinin sonucu: 142
A dizisinin kısmi_toplamı: 21 46110142
Yukarıdaki programda gösterildiği gibi, önce biriktirme işlevini kullanarak elemanların toplamını hesaplıyoruz ve sonra karşılık gelen dizi elemanlarının kısmi toplamını hesaplamak için kısmi_süm işlevini çağırıyoruz.
STL ve başlık tarafından desteklenen diğer algoritmalar:
- iota: Bir aralığı, başlangıç değerinin art arda artışlarıyla doldurur.
- azalt: Arıza dışında biriktirmeye benzer.
- iç ürün: İki öğe aralığının iç çarpımını hesaplar.
- komşu_fark: Bir aralıktaki bitişik öğeler arasındaki farkları hesaplar.
- inclusive_scan: Kısmi_toplam'a benzer şekilde, i'inci toplamda i'inci girdi öğesini içerir.
- exclusive_scan: Kısmi_toplam'a benzer şekilde, i'inci giriş öğesini i'inci toplamdan hariç tutar.
Değiştirmeyen Algoritmalar
Değiştirmeyen veya dönüştürmeyen algoritmalar, içinde çalıştıkları kabın içeriğini değiştirmeyen algoritmalardır. STL birçok değiştirmeyen algoritmayı destekler.
Bunlardan bazılarını aşağıda listeledik:
- Miktar: Verilen aralıktaki değerlerin sayısını döndürür.
- eşit: İki aralıktaki öğeleri karşılaştırır ve bir Boole değeri döndürür.
- uyumsuzluk: İki yineleyici karşılaştırıldığında ve bir uyumsuzluk meydana geldiğinde bir çift yineleyici döndürür.
- arama: Belirli bir aralıkta belirli bir diziyi arar.
- search_n: Belirli bir aralıkta bir sayı değeri dizisi arar.
'Sayma' ve 'eşitlik' işlevleri hakkında daha fazla ayrıntı verelim !!
count (ilk, son, değer), 'değer' in (ilk, son) aralığında görünme sayısını döndürür.
#include #include using namespace std; int main () { int values() = {5,1,6,9,10,1,12,5,5,5,1,8,9,7,46}; int count_5 = count(values, values+15, 5); cout<<'The number of times '5' appears in array= '< Çıktı:
Bir dizide '5' görünme sayısı = 4
Bu kodda gördüğünüz gibi, bir dizi değeri tanımlıyoruz ve ardından değer aralığını ve 5 değerini sağlayarak count işlevini çağırıyoruz. İşlev, aralıkta 5 değerinin görünme sayısını (count) döndürür.
'Eşit' işlevini göstermek için bir örnek alalım.
eşittir (ilk1, son1, ilk2), (ilk1, son1) aralığındaki öğeleri ilk2'nin işaret ettiği ilk öğeyle karşılaştırır ve tüm öğeler eşitse, aksi takdirde yanlışsa doğru değerini döndürür.
#include #include using namespace std; int main() { int inputs1() = { 1,2,3,4,5,6,7,8}; int inputs2() = { -1,2,1,2,3,4,6,7,8,9}; if (equal( inputs1 , inputs1+8 , inputs2 )==1) cout<<'Elements in Two ranges are equal'; else cout<<'Elements in two ranges are not equal'; } Çıktı:
İki aralıktaki öğeler eşit değildir.
Yukarıdaki kodda, iki tamsayı dizisi tanımlıyoruz ve 'eşit' işlevini kullanarak karşılık gelen elemanlarını karşılaştırıyoruz. Dizinin elemanları aynı olmadığından, eşitler yanlış döndürür.
Algoritmaları Değiştirme
Algoritmaların değiştirilmesi, yürütüldüklerinde kapların içeriğini değiştirir veya dönüştürür.
En popüler ve yaygın olarak kullanılan değiştirme algoritmaları, sırasıyla iki değeri değiştiren ve kaptaki öğeleri tersine çeviren 'takas' ve 'tersine çevir' içerir.
Bu işlevlerin örneklerini görelim:
#include #include #include #include using namespace std; int main () { vector vec1 = {1,1,2,3,5}; vector vec2 = {2,4,6,8,10}; swap(vec1,vec2); cout<<'Vector 1 : '; for (auto it = vec1.begin(); it < vec1.end(); ++it) cout << *it << ' '; cout< Çıktı:
Vektör 1: 2 4 6 8 10
Vektör 2: 1 1 2 3 5
Ters Vektör 1: 10 8 6 4 2
Ters Vektör 2: 5 3 2 1 1
Görüldüğü gibi programda tanımlanmış iki vektörümüz var. Önce takas işlevini kullanarak vektör1 ve vektör2'nin içeriklerini değiştiririz. Daha sonra, ters işlevi kullanarak her vektörün içeriğini tersine çeviririz.
Program, Vektör 1 ve Vektör 2'yi içeriklerini değiştirdikten sonra ve ayrıca içerikleri tersine çevirdikten sonra çıkarır.
Minimum ve Maksimum İşlemler
Bu kategori, verilen iki değerden sırasıyla minimum ve maksimum değerleri bulan min ve maks fonksiyonlarından oluşur.
Bu işlevlerin genel sözdizimi şöyledir:
max(objecta, objectb); min(objecta, objectb); Ayrıca, 'karşılaştırma_işlevi' ni sağlamak için üçüncü bir parametre veya min / maks değerini bulmak için kullanılacak kriterleri sağlayabiliriz. Bu sağlanmadıysa, karşılaştırma için max işlevi '>' operatörünü kullanırken min işlevi '<’ operator for comparison.
Bu işlevleri bir program kullanarak gösterelim.
#include #include using namespace std; int main() { int x=4, y=5; cout<<'Max of 4 and 5 : '; cout << max(x,y); cout< Çıktı:
Java'da soyut arayüz örneği
Maksimum 4 ve 5: 5
Min 4 ve 5: 4
Maksimum Dize: daha küçük dize
Min String: daha uzun dize
Yukarıdaki program, min ve max fonksiyonlarını önce sayılarda ve sonra dizelerde kullandığımız için kendi kendini açıklayıcıdır. İsteğe bağlı 'karşılaştırma_işlevi' sağlamadığımız için, min / maks işlevleri sırasıyla 'operatörlere göre hareket etti.
Sonuç
Bununla, STL'de kullanılan ana algoritmalarla ilgili bu eğitimin sonuna geldik.
Sonraki eğitimlerimizde, konteynerlerden bağımsız olarak STL'de kullanılan ortak işlevlerle birlikte yineleyicileri ayrıntılı olarak tartışacağız.
=> Kolay C ++ Eğitim Serisini Okuyun.
Önerilen Kaynaklar