MODERN ISO C++ PROGRAMLAMA DERSLERİ: BÖLÜM 5 🚀 STL Kapsayıcıları: std::vector Mimarısı, std::map vs std::unordered_map

/*
================================================================================
🚀 MODERN ISO C++ PROGRAMLAMA DERSLERİ: BÖLÜM 5 🚀
STL Kapsayıcıları: std::vector Mimarısı, std::map vs std::unordered_map
================================================================================

GİRİŞ 📌
--------------------------------------------------------------------------------
Dördüncü bölümde Modern C++ bellek yönetiminin temel taşları olan `std::unique_ptr`,
`std::shared_ptr`, Control Block yapısını ve `std::weak_ptr` çözümlerini incelemiştik.

Bu bölümde C++ Standard Template Library (STL) mimarisini, bellek yerleşimi ve
performansı açısından `std::vector` yapısının derinliklerini, Sıralı (Associative)
ile Sırasız (Unordered) kapsayıcılar arasındaki algoritmik ve donanımsal
farkları ele alacağız.
*/

#include <iostream>
#include <vector>
#include <map>
#include <unordered_map>
#include <string>
#include <cstddef>

// =============================================================================
// 1. `std::vector` İÇ MİMARİSİ VE BELLEK BÜYÜME STRATEJİSİ 📊
// =============================================================================
/*
* `std::vector`, bellekte ardışık (contiguous) olarak yerleşen dinamik dizidir.
* Arka planda 3 adet pointer ile temsil edilir (sizeof(vector) == 3 * sizeof(void*)):
* 1. T* m_start: Bellek alanının başlangıcı
* 2. T* m_finish: Son geçerli elemanın bittiği adres (size)
* 3. T* m_end_of_storage: Tahsis edilen toplam belleğin sonu (capacity)
*
* BÜYÜME MEKANİZMASI (Reallocation & Geometric Growth):
* `size() == capacity()` olduğunda vector yeni bir bellek alanı ayırır:
* - Yeni Kapasite = Mevcut Kapasite * Büyüme Faktörü (GCC/Clang: 2.0x, MSVC: 1.5x)
* - Eski elemanlar yeni alana TAŞINIR (Move Constructor 'noexcept' ise ucuzdur).
* - Eski bellek alanı serbest bırakılır.
* - Bu işlem AMORTİZE O(1) zaman karmaşıklığı sağlar.
*
* İTERATÖR GEÇERSİZLEŞMESİ (Iterator Invalidation):
* Reallocation gerçekleştiğinde ESKİ TÜM İTERATÖRLER VE İŞARETÇİLER GEÇERSİZ KALIR!
* Bu durumu önlemek için boyutu önceden bilinen durumlarda `reserve()` kullanılmalıdır.
*/

void demonstrate_vector_internals() {
std::vector<int> vec;

// reserve() ile Reallocation ve İteratör Geçersizleşmesini Önleme:
vec.reserve(5);
std::cout << "📌 reserve(5) sonrası -> Size: " << vec.size()
<< ", Capacity: " << vec.capacity() << "\n";

for (int i = 1; i <= 5; ++i) {
vec.push_back(i * 10);
std::cout << "Elem Eklendi [" << i * 10 << "] -> Size: "
<< vec.size() << ", Capacity: " << vec.capacity() << "\n";
}

// emplace_back vs push_back:
// `emplace_back` argümanları doğrudan vector bellek alanında kurar (perfect forwarding).
// Geçici nesne oluşturma ve taşıma/kopyalama maliyetini sıfırlar!
vec.emplace_back(60);
std::cout << "emplace_back(60) sonrası Capacity: " << vec.capacity() << " (Büyüme Gerçekleşti!)\n";
}


// =============================================================================
// 2. ASSOCIATIVE CONTAINERS: `std::map` (RED-BLACK TREE) 🌲
// =============================================================================
/*
* `std::map`, anahtar-değer (Key-Value) çiftlerini sıralı tutan veri yapısıdır.
* - Arka Plan: Dengeli İkili Arama Ağacı (Self-balancing Red-Black Tree).
* - Zaman Karmaşıklığı: Arama, Ekleme, Silme işlemleri kesin olarak O(log N).
* - Bellek Yerleşimi: Her eleman Heap üzerinde bağımsız bir Düğüm (Node) olarak
* tahsis edilir. Pointers (left, right, parent, color) nedeniyle bellek yükü yüksektir.
* - Cache Locality: Düğümler belleğe dağınık yayıldığı için CPU Cache Dostu DEĞİLDİR.
*/

void demonstrate_map() {
std::map<int, std::string> err_codes;

// Eleman ekleme - Anahtara göre otomatik SIRALI tutulur.
err_codes[404] = "Not Found";
err_codes[200] = "OK";
err_codes[500] = "Internal Server Error";

std::cout << "🌲 std::map İterasyonu (Key Sıralı):\n";
for (const auto& [code, msg] : err_codes) { // Structured Binding (ISO C++17)
std::cout << " [" << code << "] -> " << msg << "\n";
}
}


// =============================================================================
// 3. UNORDERED CONTAINERS: `std::unordered_map` (HASH TABLE) ⚡
// =============================================================================
/*
* `std::unordered_map`, anahtarları sırasız olarak Hash Tablosunda saklar.
* - Arka Plan: Hash Table + Separate Chaining (Çakışmalar için Bağlı Liste).
* - Zaman Karmaşıklığı: Arama/Ekleme Ortalama O(1), En Kötü Senaryo O(N) (Hash Collision).
* - Custom Hash: Kendi türlerimizi kullanmak için `std::hash` özelleştirmesi gerekir.
*/

struct User {
std::size_t id;
std::string username;

bool operator==(const User& other) const noexcept {
return id == other.id && username == other.username;
}
};

// Custom Hash Struct (ISO C++ Standartlarına Uygun Özelleştirme)
struct UserHash {
std::size_t operator()(const User& u) const noexcept {
// Hash Birleştirme (Hash Combine)
std::size_t h1 = std::hash<std::size_t>{}(u.id);
std::size_t h2 = std::hash<std::string>{}(u.username);
return h1 ^ (h2 << 1);
}
};

void demonstrate_unordered_map() {
std::unordered_map<User, std::string, UserHash> user_sessions;

User u1{101, "sys_admin"};
user_sessions[u1] = "Active_Session_9921";

std::cout << "⚡ std::unordered_map Arama (O(1) Ortalama):\n";
if (auto it = user_sessions.find(u1); it != user_sessions.end()) {
std::cout << " Kullanıcı: " << it->first.username << " -> Oturum: " << it->second << "\n";
}
}


// =============================================================================
// 4. KARŞILAŞTIRMA TABLOSU VE SEÇİM REHBERİ ⚖️
// =============================================================================
/*
* ┌──────────────────────┬─────────────────────┬───────────────────────────┐
* │ Özellik │ std::map │ std::unordered_map │
* ├──────────────────────┼─────────────────────┼───────────────────────────┤
* │ Veri Yapısı │ Red-Black Tree │ Hash Table │
* │ Arama / Ekleme │ O(log N) │ O(1) Ortalama / O(N) Worst│
* │ Eleman Sırası │ Anahtara göre sıralı│ Sırasız (Unordered) │
* │ İteratör Tipi │ Bidirectional │ Forward │
* │ CPU Cache Performansı│ Düşük │ Orta / Düşük │
* └──────────────────────┴─────────────────────┴───────────────────────────┘
*
* PERFORMANS İPUCU 💡:
* Sıralama ihtiyacı yoksa ve hızlı arama gerekiyorsa varsayılan olarak
* `std::unordered_map` tercih edilmelidir. Ancak ardışık bellek yerleşimi ve
* CPU Cache optimizasyonu nedeniyle küçük veri setlerinde `std::vector` içinde
* doğrusal arama yapmak bile `std::map` kullanımından daha hızlı olabilir!
*/


// =============================================================================
// 5. MAIN VE PROGRAM GİRİŞ NOKTASI 🚀
// =============================================================================

int main() {
std::cout << "============================================" << std::endl;
std::cout << " ISO C++17/20/23 Dersleri - Bolum 5 " << std::endl;
std::cout << "============================================" << std::endl << std::endl;

std::cout << "--- 1. std::vector Büyüme ve Bellek Yapısı ---" << std::endl;
demonstrate_vector_internals();

std::cout << "\n--- 2. std::map (Red-Black Tree) ---" << std::endl;
demonstrate_map();

std::cout << "\n--- 3. std::unordered_map (Hash Table & Custom Hash) ---" << std::endl;
demonstrate_unordered_map();

std::cout << "\n✔ Bolum 5 Kavramları Başarıyla İşlendi!" << std::endl;

return 0;
}

/*
================================================================================
BÖLÜM ÖZETİ VE GELECEK BÖLÜM 📝
--------------------------------------------------------------------------------
Bu bölümde `std::vector` yapısının bellek büyüme ve reallocation mekanizmasını,
`std::map` ile `std::unordered_map` arasındaki algoritmik/donanımsal farkları ve
özel Hash fonksiyonu yazımını inceledik.

Gelecek Bölüm (Bölüm 6):
- Modern C++ Şablon Programlama (Template Metaprogramming) 🧩
- Function & Class Templates, Explicit & Partial Specialization
- SFINAE (Substitution Failure Is Not An Error) İlkesi & `std::enable_if`
- ISO C++20 Concepts & Constraints (`requires` klavuzu ile tip kısıtlama) ⚙️
================================================================================
Bölüm 5 Sonu.
=========================================
=======================================
*/

🔒 Bu içeriği görmek için giriş yapın

 
Yanıt yazmak için giriş yapmalısınız
Forum özelliklerini kullanmak ve Level 2 üyelik satın almak için hesabınıza giriş yapın.
135,085Konular
3,298,156Mesajlar
326,280Kullanıcılar
sikerimyeterSon Üye
Üst Alt