SDL3 Oyun Programlama sayfalarımız yayında...

Ana sayfa > Programlama > C++ Programlama > Algoritmalar

Algoritmalar

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:


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_if
remove_copy, remove_copy_if
Belirli bir aralıktaki elemanları siler.
replace, replace_copy
replace_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:


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:


#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:

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