Menu
Coddy logo textTech

STL Konteynerleri

Coddy'nin C++ Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası — ders 71 / 104.

STL konteynerleri, nesne koleksiyonlarını depolayan ve düzenleyen şablon sınıflarıdır. Her bir konteyner türü, farklı erişim desenleri ve işlemler için optimize edilmiştir. İhtiyaçlarınız için doğru konteyneri seçmek, programınızın performansını önemli ölçüde etkileyebilir.

Sıralı kapsayıcılar elemanları belirli bir sırada tutar:

#include <vector>
#include <list>

std::vector<int> vec = {1, 2, 3};  // Dinamik dizi, hızlı rastgele erişim
vec.push_back(4);                   // Sona ekle: O(1) amortize edilmiş
int x = vec[2];                     // İndis ile erişim: O(1)

std::list<int> lst = {1, 2, 3};    // Çift bağlı liste
lst.push_front(0);                  // Başa ekle: O(1)
lst.push_back(4);                   // Sona ekle: O(1)

İlişkisel kapsayıcılar, hızlı arama için öğeleri sıralı bir düzende saklar:

#include <map>
#include <set>

std::set<int> s = {3, 1, 4, 1};    // Benzersiz sıralı öğeler: {1, 3, 4}
s.insert(2);                        // Ekleme: O(log n)
bool found = s.count(3);            // Varlık kontrolü: O(log n)

std::map<std::string, int> ages;   // Anahtar-değer çiftleri, anahtara göre sıralı
ages["Alice"] = 25;                 // Ekleme/güncelleme: O(log n)
ages["Bob"] = 30;
std::cout << ages["Alice"];        // Erişim: O(log n)

Sırasız kapsayıcılar, ortalama durumda daha da hızlı arama yapmak için karma tabloları (hash tables) kullanır:

#include <unordered_map>

std::unordered_map<std::string, int> scores;
scores["player1"] = 100;            // Ekleme: O(1) ortalama
scores["player2"] = 200;
std::cout << scores["player1"];    // Erişim: O(1) ortalama

Hızlı rastgele erişime ihtiyaç duyduğunuzda vector, ortada sık eklemeler için list, sıralanmış veriye ihtiyaç duyduğunuzda map/set ve arama hızı kritik olduğunda ve sıra önemli olmadığında unordered_map kullanın.

challenge icon

Görev

Kolay

Farklı STL konteynerlerinin nasıl farklı amaçlara hizmet ettiğini gösteren bir öğrenci not yönetim sistemi oluşturalım. Öğrenci verilerini verimli bir şekilde düzenlemek için her görev için doğru konteyneri seçerek birden fazla konteyner türü kullanacaksınız.

Kodunuzu düzenlemek için iki dosya oluşturacaksınız:

  • GradeManager.h: Öğrenci bilgilerini yönetmek için birden fazla STL konteyneri kullanan bir GradeManager sınıfı tanımlayın.

    Sınıfınız şunları kullanmalıdır:

    • Öğrenci isimlerini eklendikleri sırayla saklamak için bir std::vector<std::string>
    • Her öğrenci ismini notuyla ilişkilendirmek için bir std::map<std::string, int>
    • Atanan tüm benzersiz notları takip etmek için bir std::set<int>

    Şu metotları uygulayın:

    • addStudent(const std::string& name, int grade) — bir öğrenciyi notuyla birlikte her üç konteynere de ekler
    • getGrade(const std::string& name) — map kullanarak verilen bir öğrenci ismi için notu döndürür
    • printRoster() — tüm öğrenci isimlerini eklendikleri sırayla (vector'den), her biri yeni bir satırda olacak şekilde yazdırır
    • printGrades() — tüm öğrencileri notlarıyla birlikte alfabetik sırayla (map bunu otomatik olarak halleder), her satırda name: grade formatında yazdırır
    • printUniqueGrades() — tüm benzersiz notları artan sırada (set bunu halleder), aralarında boşluk bırakarak ve sonunda bir alt satıra geçerek yazdırır
  • main.cpp: Girdileri okuyun ve her konteyner türünün nasıl farklı bir amaca hizmet ettiğini gösterin.

    Altı girdi okuyun (her biri ayrı bir satırda):

    1. Birinci öğrenci ismi
    2. Birinci öğrenci notu (tam sayı)
    3. İkinci öğrenci ismi
    4. İkinci öğrenci notu (tam sayı)
    5. Üçüncü öğrenci ismi
    6. Üçüncü öğrenci notu (tam sayı)

    Bir GradeManager oluşturun ve üç öğrenciyi de ekleyin. Ardından farklı konteyner davranışlarını gösterin:

    1. Roster (insertion order): yazdırın ve ardından printRoster() metodunu çağırın
    2. Grades (alphabetical): yazdırın ve ardından printGrades() metodunu çağırın
    3. Unique grades: yazdırın ve ardından printUniqueGrades() metodunu çağırın
    4. İkinci öğrencinin notuna bakın ve <name>'s grade: <grade> yazdırın

Örneğin, Charlie, 85, Alice, 90, Bob, 85 girdileriyle:

Roster (insertion order):
Charlie
Alice
Bob
Grades (alphabetical):
Alice: 90
Bob: 85
Charlie: 85
Unique grades:
85 90 
Alice's grade: 90

Vector'ün ekleme sırasını (Charlie, Alice, Bob) nasıl koruduğuna, map'in anahtara göre otomatik olarak nasıl sıraladığına (Alice, Bob, Charlie) ve set'in yalnızca benzersiz değerleri sıralı düzende nasıl sakladığına (85 iki kez değil, bir kez görünür) dikkat edin. Her konteyner türü farklı görevlerde mükemmeldir!

Kopya kağıdı

STL konteynerleri, nesne koleksiyonlarını depolamak ve düzenlemek için kullanılan şablon sınıflarıdır. Her tür, farklı işlemler için optimize edilmiştir.

Sıralı Konteynerler

Elemanları belirli bir sırada tutarlar:

#include <vector>
#include <list>

std::vector<int> vec = {1, 2, 3};  // Dinamik dizi, hızlı rastgele erişim
vec.push_back(4);                   // Sona ekle: O(1) amortize edilmiş
int x = vec[2];                     // İndeks ile erişim: O(1)

std::list<int> lst = {1, 2, 3};    // Çift bağlı liste
lst.push_front(0);                  // Başa ekle: O(1)
lst.push_back(4);                   // Sona ekle: O(1)

İlişkisel Konteynerler

Hızlı arama için elemanları sıralı bir düzende saklarlar:

#include <map>
#include <set>

std::set<int> s = {3, 1, 4, 1};    // Benzersiz sıralı elemanlar: {1, 3, 4}
s.insert(2);                        // Ekleme: O(log n)
bool found = s.count(3);            // Varlık kontrolü: O(log n)

std::map<std::string, int> ages;   // Anahtar-değer çiftleri, anahtara göre sıralı
ages["Alice"] = 25;                 // Ekleme/güncelleme: O(log n)
ages["Bob"] = 30;
std::cout << ages["Alice"];        // Erişim: O(log n)

Sırasız Konteynerler

Ortalama durumda daha hızlı arama için karma (hash) tabloları kullanırlar:

#include <unordered_map>

std::unordered_map<std::string, int> scores;
scores["player1"] = 100;            // Ekleme: Ortalama O(1)
scores["player2"] = 200;
std::cout << scores["player1"];    // Erişim: Ortalama O(1)

Doğru Konteyneri Seçmek

  • vector: Hızlı rastgele erişim
  • list: Ortaya sık ekleme yapılması durumu
  • map/set: Sıralı veri gerektiğinde
  • unordered_map: Arama hızı kritikse ve sıra önemli değilse

Kendin dene

#include <iostream>
#include <string>
#include "GradeManager.h"

using namespace std;

int main() {
    // Üç öğrenci için girdileri oku
    string name1, name2, name3;
    int grade1, grade2, grade3;
    
    cin >> name1;
    cin >> grade1;
    cin >> name2;
    cin >> grade2;
    cin >> name3;
    cin >> grade3;
    
    // TODO: Bir GradeManager nesnesi oluştur
    
    // TODO: Üç öğrencinin hepsini GradeManager'a ekle
    
    // TODO: "Roster (insertion order):" yazdır ve printRoster() fonksiyonunu çağır
    
    // TODO: "Grades (alphabetical):" yazdır ve printGrades() fonksiyonunu çağır
    
    // TODO: "Unique grades:" yazdır ve printUniqueGrades() fonksiyonunu çağır
    
    // TODO: İkinci öğrencinin notuna bak ve "<name>'s grade: <grade>" yazdır
    
    return 0;
}
quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Nesne Yönelimli Programlama bölümündeki tüm dersler