Bu proje, STL (Standard Template Library) kullanımı üzerine üç temel egzersiz içermektedir. İlk bölümde STL kapsayıcılarda arama yapan generic bir easyfind
fonksiyonu, ikinci bölümde sayılar arasındaki farkları hesaplayan Span
sınıfı, üçüncü bölümde ise iterator destekli MutantStack
sınıfı geliştirilmiştir. Proje, C++’ta şablonlar, kapsayıcılar ve algoritmalara hakimiyeti artırmayı hedefler.
Container, belirli bir türdeki verileri belirli bir bellek düzeninde tutan yapılardır. C++ dilindeki Standart Kütüphane’de (STL — Standard Template Library), sıkça kullanılan birçok container çeşidi vardır (örneğin, vector
, list
, deque
, map
, set
vb.). Kapsayıcılar şu işlevleri gerçekleştirir:
- Verileri bellek üzerinde saklarlar.
- Sakladıkları verilere erişimi belirli kurallar çerçevesinde düzenlerler (örneğin, dizi gibi sıralı erişim veya harita gibi anahtar-değer erişimi).
- Eleman ekleme, silme ve sıralama gibi temel işlemleri kolay ve performanslı şekilde sunarlar.
Kapsayıcıların avantajları şunlardır:
- Güvenlik: Ham pointer veya ham bellek yönetimi yerine kapsayıcılar kullanmak, veri yönetimini kolaylaştırır ve hata yapma olasılığını azaltır.
- Verimlilik: Standart Kütüphane’deki kapsayıcılar çoğu kullanım senaryosu için optimize edilmiştir.
- Kolaylık: Aynı kapsayıcı yapısı farklı veri türlerinde kullanılabilir (templateler aracılığıyla).
Iterator (yineleyici), kapsayıcılardaki veriler arasında gezinmeyi ve onlara erişimi sağlayan bir yapıdır. Genellikle, C++’ta dizilerde veya STL kapsayıcılarında kullanılabilen pointer
benzeri nesnelerdir. Örneğin:
- Bir
vector<int>
üzerinden yineleyici (iterator) kullanarak elemanları sırasıyla okuyabilir veya değiştirebilirsiniz. - İteratörler, C++ algoritmalarının (örn.
std::sort
,std::find
) kapsayıcılarla birlikte sorunsuz çalışmasını sağlar.
İteratörlerin bazı önemli noktaları:
- Abstraction (Soyutlama): Gerçek bellek adresi ile uğraşmadan elemanlara erişim sağlanır.
- Taşınabilirlik: Aynı kodu, farklı kapsayıcı tiplerinde yineleyicilerle kullanabilirsiniz.
- Çeşitlilik: C++’ta birden çok iterator kategorisi vardır (örneğin,
input_iterator
,forward_iterator
,bidirectional_iterator
,random_access_iterator
gibi). Bu kategoriler, hangi operasyonları destekleyebileceklerini belirler.
Vector, C++ dilinde en sık kullanılan kapsayıcılardan biridir. Dinamik boyutlu bir dizi (array) gibi davranır; yani bellek alanı yetmediğinde kendine ayrılan alanı otomatik olarak genişletir. Başlıca özellikleri:
- Sıralı (Sequential) Erişim: Elemanlar bellek içinde arka arkaya saklanır, bu da rastgele erişim (
random access
) işlemlerini çok hızlı hale getirir (O(1)
zaman karmaşıklığı). - Dinamik Boyut Değiştirme:
push_back()
ile vektörün sonuna eleman ekleyebilir,pop_back()
ile son elemanı silebilirsiniz. Boyutu esnek bir şekilde artıp azalır. - İteratör Kullanımı:
begin()
,end()
,rbegin()
,rend()
gibi fonksiyonlar ile vektör içindeki elemanlar üzerinde dolaşmak için yineleyiciler (iterator) alınabilir. - Avantaj / Dezavantaj:
- Avantaj: Rastgele erişimin (örn.
v[5]
) çok hızlı olması, ekleme/çıkarma işlemlerinin (özellikle sondan ekleme/çıkarma) pratik olması. - Dezavantaj: Ortalardan ekleme veya silme yapıldığında elemanların kaydırılması gerektiği için bu işlemlerin maliyeti artar.
- Avantaj: Rastgele erişimin (örn.
Örnek
#include <iostream>
#include <vector>
int main() {
std::vector<int> numbers; // Boş bir vector
// Eleman ekleme
numbers.push_back(10);
numbers.push_back(20);
numbers.push_back(30);
// İteratör ile okuma
for (auto it = numbers.begin(); it != numbers.end(); ++it) {
std::cout << *it << " ";
}
// Çıktı: 10 20 30
return 0;
}
Span, belli sayıda tamsayıyı saklayabilen bir kapsayıcı sınıftır ve bu tamsayılar arasındaki en kısa ve en uzun mesafeyi (span) hesaplamak amacıyla kullanılır.
İki tamsayı arasındaki mesafe, mutlak farkları ile hesaplanır:
- Örnek:
|3 - 9| = 6
Shortest Span, birbiri ardına gelen iki sayı arasındaki en küçük farktır.
Longest Span, en küçük ve en büyük sayı arasındaki farktır.
-
std::sort
: Vektörü sıralamak için kullanılır, çünkü shortest span hesaplamak için sıralama gerekir.std::sort(vec.begin(), vec.end());
-
std::distance
: İki iterator arasındaki eleman sayısını verir. Span hesaplamasında dolaylı kullanılır.
- Kısa span: Vektörü sırala, ardından ardışık farkların minimumunu bul.
- Uzun span: Min ve max değerlerin farkını al.
std::vector
, std::list
, std::set
gibi kapsayıcılardan Span nesnesine toplu şekilde eleman eklemek için iterator aralığı alan bir addRange()
fonksiyonu yazılmalıdır:
template <typename Iterator>
void addRange(Iterator begin, Iterator end);
Stack, LIFO (Last-In First-Out) mantığıyla çalışan bir veri yapısıdır. std::stack
, push
, pop
, top
, empty
, size
gibi temel işlemleri destekler. Ancak STL’de std::stack
iterable değildir.
std::stack
, iterator desteklemez çünkü begin()
ve end()
metodları yoktur. Bu, for
döngüsü ile gezinmeyi imkansız hale getirir. Örneğin:
std::stack<int> s;
// s.begin() -> derleme hatası
MutantStack, std::stack
’i kalıtım yoluyla genişletip iterator desteği ekleyen özel bir sınıftır. Böylece stack içeriği üzerinde begin()
/ end()
kullanarak gezinmek mümkün hale gelir.
template<typename T>
class MutantStack : public std::stack<T> {
public:
typedef typename std::stack<T>::container_type::iterator iterator;
iterator begin() { return this->c.begin(); }
iterator end() { return this->c.end(); }
};
std::stack
, aslında std::deque
'i temel alır. container_type
, stack
’in kullandığı bu yapıya erişmeyi sağlar. Bu sayede stack
’in elemanlarına direkt olarak iterator ile ulaşabiliriz.
int main() {
MutantStack<int> mstack;
mstack.push(5);
mstack.push(17);
std::cout << mstack.top() << std::endl;
mstack.pop();
std::cout << mstack.size() << std::endl;
mstack.push(3);
mstack.push(5);
mstack.push(737);
mstack.push(0);
MutantStack<int>::iterator it = mstack.begin();
MutantStack<int>::iterator ite = mstack.end();
while (it != ite) {
std::cout << *it << std::endl;
++it;
}
return 0;
}
-
std::stack
’in tüm özellikleri korunur. -
Iterator desteği ile kolay
test
,debug
vealgoritma
işlemleri yapılabilir. -
std::list
ile aynı çıktıyı verecek şekilde test edilebilir.
2025 This project was created by Derya ACAR.