Ana sayfa C++ Algoritmalar
Gönderi
İptal

C++ 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:

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 


AlgoritmaAçıklama
adjacent_findBir 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_searchSıralı bir dizi içinde ikili sistem araması yapar.
copyBir diziyi kopyalar.
copy_backwardcopy ile aynı işlemi yapar. Tek fark, sondan başa doğru hareket eder.
countSıra içindeki eleman sayısını geri döndürür.
count_ifDizideki 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_rangeSıralamayı bozmadan bir elemanın bir sıralamaya eklenebileceği bir aralık geri döndürür.
fill ve fill_nBelirli bir aralığı bir değerle doldurur.
findBir 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_endBir 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_ofBir değerin bir sıralamadaki ilk konumunu arar.
find_ifKullanıcı tanımlı bir koşulun doğru olduğu bir eleman için bir aralığı arar.
for_eachBir fonksiyonu bir aralıktaki elemanlara uygular.
generate ve generate_nBir fonksiyonun geri döndürdüğü değerleri bir aralıktaki elemanlara atar.
includesBir dizinin başka bir dizideki tüm elemanları içerip içermediğini belirler.
inplace_mergeBir 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_compareBir diziyi diğeriyle alfabetik olarak karşılaştırır.
lower_boundDizide belirtilen değerden daha az olmayan ilk noktayı bulur.
make_heapBir diziden bir yığın oluşturur.
maxİki değerin büyük olanını geri döndürür.
max_elementBir 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_elementBir 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_permutationBir eleman dizisinin bir sonraki permütasyonunu oluşturur.
nth_elementBir 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_sortBir aralıktaki elemanları sıralar.
partial_sort_copyBir aralıktaki elemanları sıralar ve sonuç dizisinin alacağı kadarını kopyalar.
partitionBir 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_heapBir yığının ilk ve sondan bir önceki elemanlarını değitirir ve yığını yeniden oluşturur.
prev_permutationBir eleman dizisinin bir önceki permütasyonunu oluşturur.
push_heapYığının sonuna bir eleman ekler.
random_shuffleBir dizi elemanı rastgele seçer.
remove, remove_ifremove_copy, remove_copy_ifBelirli bir aralıktaki elemanları siler.
replace, replace_copyreplace_if, replace_copy_ifBelirli bir aralıktaki elemanları değiştirir.
reverse and reverse_copyBelirli bir aralığın sırasını değiştirir.
rotate ve rotate_copyBelirli bir aralıktaki elemanları sola kaydıdır.
searchBir eleman dizisinde bir alt eleman dizisini arar.
search_nBelirtilen 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.
sortBir eleman aralığını sıralar.
sort_heapBelirli bir aralıktaki yığını sıralar.
stable_partitionBir 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_sortBir 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_rangesBir aralıktaki elemanları birbiri ile değiştirir.
transformBir aralıktaki elemanlara bir fonksiyon çağırır ve elde edilen çıktıyı yeni bir eleman dizisine kaydeder.
unique ve unique_copyBir aralıktaki tekrar eden elemanları devere dışı bırakır.
upper_boundBir 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

Bu gönderi CC BY 4.0 lisansı altındadır.

C++ Map

C++ Fonksiyon nesneleri