Algoritma hakkında
Algoritmalar konteynerler üzerinde işlem yaparlar. Her konteyner kendi temel işlemleri için gerekli fonksiyonları sağlar. Standart algoritmalar ise daha genişletilmiş veya karmaşık işlemler için aynı anda iki farklı tipte konteyner ile çalışmaya olanak sağlar.
STL içindeki algoritmaları kullanmak için, programlarımıza <algorithm>
başlık dosyasını eklememiz gerekir.
Herhangi bir konteyner ile kullanılabilen ve tümünün bildirimi şablon olarak yapılmış olan STL algoritmalarının bir kısmı aşağıdaki tabloda yer almaktadır:
1
2
3
4
5
6
7
8
vector<int> v { 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4 }; // Range
vector<int> t1 { 1, 2, 3 }; // Sequence
find_end(v.begin(), v.end(), t1.begin(), t1.end());
find_end: finds the last sequence of elements in a certain range
Algoritma | Açıklama |
---|---|
adjacent_find | Bir sıra içinde bitişik eşleşen elemanları arar ve ilk eşleşmeyi gösteren bir tekrarlayıcı geri döndürür. |
binary_search | Sıralı bir dizi içinde ikili sistem araması yapar. |
copy | Bir diziyi kopyalar. |
copy_backward | copy ile aynı işlemi yapar. Tek fark, sondan başa doğru hareket eder. |
count | Sıra içindeki eleman sayısını geri döndürür. |
count_if | Dizideki bazı koşulları karşılayan elemanların sayısını geri döndürür. |
equal | İki aralığın aynı olup olmadığını belirler. |
equal_range | Sıralamayı bozmadan bir elemanın bir sıralamaya eklenebileceği bir aralık geri döndürür. |
fill ve fill_n | Belirli bir aralığı bir değerle doldurur. |
find | Bir aralıkta bir değer için arama yapar arar ve elemanın ilk geçtiği yeri gösteren bir tekrarlayıcı geri döndürür. |
find_end | Bir değerin bir aralıktaki en son konumunu arar ve elemanın geçtiği yeri gösteren bir tekrarlayıcı geri döndürür. |
find_first_of | Bir değerin bir sıralamadaki ilk konumunu arar. |
find_if | Kullanıcı tanımlı bir koşulun doğru olduğu bir eleman için bir aralığı arar. |
for_each | Bir fonksiyonu bir aralıktaki elemanlara uygular. |
generate ve generate_n | Bir fonksiyonun geri döndürdüğü değerleri bir aralıktaki elemanlara atar. |
includes | Bir dizinin başka bir dizideki tüm elemanları içerip içermediğini belirler. |
inplace_merge | Bir aralığı başka bir aralıkla birleştirir. Her iki aralık da artan sıra ile sıralanmalıdır.Ortaya çıkan dizi sıralı olur. |
iter_swap | İki tekrarlayıcı parametre ile gösterilen değerleri değiştirir. |
lexicographical_compare | Bir diziyi diğeriyle alfabetik olarak karşılaştırır. |
lower_bound | Dizide belirtilen değerden daha az olmayan ilk noktayı bulur. |
make_heap | Bir diziden bir yığın oluşturur. |
max | İki değerin büyük olanını geri döndürür. |
max_element | Bir aralıktaki en büyük elamanı gösteren bir tekrarlayıcı geri döndürür. |
merge | İki eleman dizisini birleştirerek üçüncü bir eleman dizisine atar. |
min | İki değerin küçük olanını geri döndürür. |
min_element | Bir aralıktaki en küçük elamanı gösteren bir tekrarlayıcı geri döndürür. |
mismatch | İki eleman dizisi elemanları arasında ilk benzemeyenleri bulur ve bu elemanların adreslerini gösteren tekrarlayıcıları geri döndürür. |
next_permutation | Bir eleman dizisinin bir sonraki permütasyonunu oluşturur. |
nth_element | Bir dizi eleman içinde, belirli bir elemandan küçük olan tüm elemanlar bu elemandan önce ve büyük tüm elemanlar ondan sonra gelecek şekilde düzenleme yapar. |
partial_sort | Bir aralıktaki elemanları sıralar. |
partial_sort_copy | Bir aralıktaki elemanları sıralar ve sonuç dizisinin alacağı kadarını kopyalar. |
partition | Bir dizi elemanı, belirli bir koşulun doğru değer döndürdüğü elemanlar, yanlış değer geri döndürdüğü elemanlardan önce gelecek şekilde düzenler. |
pop_heap | Bir yığının ilk ve sondan bir önceki elemanlarını değitirir ve yığını yeniden oluşturur. |
prev_permutation | Bir eleman dizisinin bir önceki permütasyonunu oluşturur. |
push_heap | Yığının sonuna bir eleman ekler. |
random_shuffle | Bir dizi elemanı rastgele seçer. |
remove, remove_ifremove_copy, remove_copy_if | Belirli bir aralıktaki elemanları siler. |
replace, replace_copyreplace_if, replace_copy_if | Belirli bir aralıktaki elemanları değiştirir. |
reverse and reverse_copy | Belirli bir aralığın sırasını değiştirir. |
rotate ve rotate_copy | Belirli bir aralıktaki elemanları sola kaydıdır. |
search | Bir eleman dizisinde bir alt eleman dizisini arar. |
search_n | Belirtilen sayıda benzer eleman dizisini arar. |
set_difference | İki sıralı eleman dizisi arasındaki farkı içeren bir eleman dizisi oluşturur. |
set_intersection | İki sıralı eleman dizisinin kesişimini içeren bir eleman dizisi oluşturur. |
set_symmetric_difference | İki sıralı eleman dizisi arasındaki simetrik farkı içeren bir eleman dizisi oluşturur. |
set_union | İki sıralı eleman dizisinin birleşimini içeren bir eleman dizisi oluşturur. |
sort | Bir eleman aralığını sıralar. |
sort_heap | Belirli bir aralıktaki yığını sıralar. |
stable_partition | Bir dizi elemanı, belirli bir koşulun doğru değer döndürdüğü elemanlar, yanlış değer geri döndürdüğü elemanlardan önce gelecek şekilde düzenler.Bölümleme işlemi kararlıdır. Bu, eleman dizisinin ilişkili sıralamasının korunduğunu gösterir. |
stable_sort | Bir eleman aralığını sıralar. Sıralama kararlı olup, eşit elemanların yeniden düzenlenmediğini gösterir. |
swap | İki değeri birbiri ile değitirir. |
swap_ranges | Bir aralıktaki elemanları birbiri ile değiştirir. |
transform | Bir aralıktaki elemanlara bir fonksiyon çağırır ve elde edilen çıktıyı yeni bir eleman dizisine kaydeder. |
unique ve unique_copy | Bir aralıktaki tekrar eden elemanları devere dışı bırakır. |
upper_bound | Bir değerden büyük olmayan bir eleman dizisindeki son noktayı bulur. |
Bir konteyner içinde belirli bir değere sahip veya belirli bir koşulu sağlayan eleman sayısını bulma
Bir konteyner içindeki eleman sayısını bulmak için size() fonksiyonu kullanılır. Bir konteyner içinde belli bir değere sahip eleman sayısını bulmak için count() fonksiyonunu, belli bir koşulu sağlayan eleman sayısını bulmak için ise, count_if() fonksiyonunu kullanabiliriz. Her iki fonksiyonun genel yapısı aşağıda gösterilmektedir:
1
2
3
4
template <class InIter, class T> ptrdiff_t count(InIter start, InIter end, const T &val);
template <class InIter, class UnPred> ptrdiff_t count_if(InIter start, InIter end, UnPred pfn);
ptrdiff_t: int bir değerdir.
Şimdi, oluşturulan bir vektör içinde, count() ve count_if() fonksiyonlarını kullanarak, belli bir değere sahip eleman sayısını ve belli bir koşulu sağlayan eleman sayısını bulma işlemlerini bir örnek üzerinde incelemeye çalışalım:
Örnek
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
bool buyuk_dort(int id)
{
return (id>4);
}
int main(void)
{
// 10 elemanlı bir int vektör bildirimi yapar.
vector<int> iv = { 1, 2, 3, 3, 4, 4, 4, 5, 6, 7 }; // C++11
int id;
// Vektör içeriğini ekrana yazma
cout << "Vektör içeriği: ";
for(id=0; id<(int)iv.size(); id++) cout << iv[id] << " ";
cout << endl;
// iv vektörünün eleman sayısını yazar.
cout << "iv vektör eleman sayısı: " << iv.size() << endl;
// Vektördeki belirli değere sahip eleman sayısını ekrana yazma
cout << "Vektörde 3 değerine sahip eleman sayısı: " << count(iv.begin(), iv.end(), 3) << "\n";
cout << "Vektörde 4 değerine sahip eleman sayısı: " << count(iv.begin(), iv.end(), 4) << "\n";
// Vektörde 4'den büyük değere sahip eleman sayısını ekrana yazma
cout << "Vektörde 4'den büyük değere sahip eleman sayısı: " << count_if(iv.begin(), iv.end(), buyuk_dort);
return 0;
}
Yukarıdaki programı derleyip çalıştırdığımızda, aşağıdaki ifadeleri ekrana yazar:
1
2
3
4
5
6
7
Vektör içeriği: 1 2 3 3 4 4 4 5 6 7
iv vektör eleman sayısı: 10
Vektörde 3 değerine sahip eleman sayısı: 2
Vektörde 4 değerine sahip eleman sayısı: 3
Vektörde 4'den büyük değere sahip eleman sayısı: 3