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 kapsayıcıları, nesne koleksiyonlarını depolayan ve düzenleyen şablon sınıflarıdır. Her kapsayıcı türü, farklı erişim düzenleri ve işlemler için optimize edilmiştir. İhtiyaçlarınıza uygun kapsayıcıyı seçmek, programınızın performansını önemli ölçüde etkileyebilir.

Sıralı kapsayıcılar öğeleri 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];                     // İ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 kapsayıcılar, hızlı arama için öğeleri sıralı düzende saklar:

#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 kapsayıcılar, ortalama durumda daha da hızlı arama için karma tabloları 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ğunda vector, ortada sık sık ekleme yapmak için list, sıralanmış verilere ihtiyaç duyduğunda map/set ve arama hızı kritik olduğunda ve sıra önemli olmadığında unordered_map kullan.

challenge icon

Görev

Kolay

Farklı STL kapsayıcılarının farklı amaçlara nasıl hizmet ettiğini gösteren bir öğrenci notu yönetim sistemi oluşturalım. Öğrenci verilerini verimli bir şekilde düzenlemek için birden fazla kapsayıcı türü kullanacak ve her görev için doğru kapsayıcıyı seçeceksin.

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

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

    Sınıfın şunları kullanmalı:

    • Öğrenci adlarını eklenme sırasına göre depolamak için bir std::vector<std::string>
    • Her öğrenci adını notuyla ilişkilendirmek için bir std::map<std::string, int>
    • Atanmış tüm benzersiz notları izlemek için bir std::set<int>

    Şu metotları uygula:

    • addStudent(const std::string& name, int grade): bir öğrenciyi notuyla birlikte üç kapsayıcının tümüne ekler
    • getGrade(const std::string& name): map'i kullanarak verilen öğrenci adının notunu döndürür
    • printRoster(): tüm öğrenci adlarını eklenme sırasına göre (vector'dan) yazdırır; her ad yeni bir satırda yer alır
    • printGrades(): tüm öğrencileri notlarıyla birlikte alfabetik sırada yazdırır (map bunu otomatik olarak yapar); her satırda name: grade biçimini kullanır
    • printUniqueGrades(): tüm benzersiz notları artan sırada yazdırır (bunu set gerçekleştirir); notlar boşluklarla ayrılır ve ardından yeni satır gelir
  • main.cpp: Girdileri oku ve her kapsayıcı türünün farklı bir amaca nasıl hizmet ettiğini göster.

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

    1. İlk öğrencinin adı
    2. İlk öğrencinin notu (tam sayı)
    3. İkinci öğrencinin adı
    4. İkinci öğrencinin notu (tam sayı)
    5. Üçüncü öğrencinin adı
    6. Üçüncü öğrencinin notu (tam sayı)

    Bir GradeManager oluştur ve üç öğrencinin tümünü ekle. Ardından farklı kapsayıcı davranışlarını göster:

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

Örneğin girdiler Charlie, 85, Alice, 90, Bob, 85 olduğunda:

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) koruduğuna, map'in anahtara göre otomatik olarak sıralama yaptığına (Alice, Bob, Charlie) ve set'in yalnızca sıralı düzende benzersiz değerleri depoladığına (85 iki kez değil, bir kez görünür) dikkat et. Her kapsayıcı türü farklı görevlerde başarılıdır!

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: Print "Roster (insertion order):" and call printRoster()
    
    // TODO: Print "Grades (alphabetical):" and call printGrades()
    
    // TODO: Print "Unique grades:" and call printUniqueGrades()
    
    // TODO: İkinci öğrencinin notunu bul 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

Kendi başına pratik yap: Online C++ derleyicisi