6.1 STL'in Akademik Yapısı
Standart Şablon Kütüphanesi (Standard Template Library - STL), Alexander Stepanov'un jenerik programlama felsefesi üzerine kurulmuştur. STL'in başarısı, veri yapıları (Containers) ve algoritmaların (Algorithms) birbirinden tamamen bağımsız olarak tasarlanması ve Yineleyiciler (Iterators) aracılığıyla konuşturulmasıdır.
Kaplar (Containers)
Veriyi organize eden yapılar. (Örn: vector, list, map)
Algoritmalar
Veri üzerinde işlem yapan fonksiyonlar. (Örn: sort, find)
Yineleyiciler
Kaplar ve algoritmalar arasındaki köprü.
Fonktörler
Fonksiyon nesneleri ve Lambda ifadeleri.
6.2 STL Bileşen Etkileşim Modeli
Şema 6.1: STL Bileşenlerinin Ayrıştırılmış (Decoupled) Mimarisi
6.3 İleri Seviye STL: C++20/23 Menziller (Ranges)
#include <iostream>
#include <vector>
#include <algorithm>
#include <ranges> // C++20 Menziller
#include <numeric>
/**
* @brief Akademik Örnek: Modern STL ve Fonksiyonel Boru Hattı (Pipeline)
* MISRA C++:2023 Notu: 'std::vector' kullanımı manuel dizi yönetiminden (C-style array) daha güvenlidir.
*/
int main() {
std::vector<int> sayilar = {1, 5, 8, 2, 4, 9, 3, 7};
// C++20 Ranges & Views: Veriyi kopyalamadan (lazy evaluation) işleme
auto sonuc = sayilar | std::views::filter([](int n) { return n % 2 == 0; }) // Çiftleri seç
| std::views::transform([](int n) { return n * n; }); // Karelerini al
std::cout << "Cift Sayilarin Kareleri: ";
for (int n : sonuc) {
std::cout << n << " ";
}
// Akademik Not: std::ranges::sort() yineleyiciler (iterators) yerine doğrudan kabı (container) alır.
std::ranges::sort(sayilar);
return 0;
}
Mimarın Analizi:
C++20 Menziller (Ranges), STL'in en büyük evrimidir. Geleneksel `begin()` ve `end()` çiftleri yerine doğrudan nesneler üzerinde çalışır. Tembel Değerlendirme (Lazy Evaluation) prensibi sayesinde, boru hattındaki işlemler sadece ihtiyaç duyulduğunda çalışır, bu da bellek ve CPU verimliliği sağlar.
Tahsisçi (Allocator) Mimarisi:
STL kapları, bellek yönetimini özelleştirmek için Tahsisçileri (Allocators) kullanır. Akademik düzeyde bir geliştirici, yüksek başarımlı sistemlerde (HPC) `std::allocator` yerine kendi özel bellek havuzlarını (Memory Pools) yazabilir.
⚠️ STL Yan Etkileri ve Performans Tuzakları
Yineleyici Geçersiz Kılma (Iterator Invalidation)
Bir `std::vector` üzerinde döngü yaparken eleman eklemek (`push_back`), bellek yeniden tahsisine (reallocation) neden olabilir. Bu durumda eski tüm yineleyiciler "geçersiz" hale gelir ve bunlara erişim Tanımsız Davranış (UB) tetikler.
Yanlış Kap Seçimi (Complexity Mismatch)
Arama işlemlerinin yoğun olduğu bir senaryoda `std::list` kullanmak O(N) karmaşıklık yaratır. Akademik olarak bu tür durumlarda O(log N) sağlayan `std::set` veya O(1) sağlayan `std::unordered_set` tercih edilmelidir.
6.5 STL ve Algoritma Analizi Testi
Soru: 'std::vector' kabında bellek yeniden tahsisi (reallocation) ne zaman gerçekleşir?
Pratik Görev (Telegram Challenge):
"trcpp-telegram topluluğunda 'std::remove' algoritmasının tek başına eleman silmediği (Erase-Remove Idiom) sıkça sorulur. Bir vektördeki 5'ten küçük sayıları 'std::remove_if' ve 'vector::erase' kullanarak kalıcı olarak silen en verimli kodu yazın."