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) ortalamaHı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.
Görev
KolayFarklı 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 birGradeManagersı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 eklergetGrade(const std::string& name): map'i kullanarak verilen öğrenci adının notunu döndürürprintRoster(): tüm öğrenci adlarını eklenme sırasına göre (vector'dan) yazdırır; her ad yeni bir satırda yer alırprintGrades(): tüm öğrencileri notlarıyla birlikte alfabetik sırada yazdırır (map bunu otomatik olarak yapar); her satırdaname: gradebiçimini kullanırprintUniqueGrades(): 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
- Öğrenci adlarını eklenme sırasına göre depolamak için bir
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):
- İlk öğrencinin adı
- İlk öğrencinin notu (tam sayı)
- İkinci öğrencinin adı
- İkinci öğrencinin notu (tam sayı)
- Üçüncü öğrencinin adı
- Üçüncü öğrencinin notu (tam sayı)
Bir
GradeManageroluştur ve üç öğrencinin tümünü ekle. Ardından farklı kapsayıcı davranışlarını göster:Roster (insertion order):ifadesini yazdır, ardındanprintRoster()metodunu çağırGrades (alphabetical):ifadesini yazdır, ardındanprintGrades()metodunu çağırUnique grades:ifadesini yazdır, ardındanprintUniqueGrades()metodunu çağır- İ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: 90vector'ı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;
}
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
1OOP Temelleri
Harici DosyalarC++ Build ve DerlemeBaşlık Dosyaları ve Kaynak DosyalarıAd Alanları ve KapsamC++'ta OOP'ye GirişSınıflar ve Nesneler'this' İşaretçisiMetotlar (Üye Fonksiyonlar)Öznitelikler (Veri Üyeleri)Ctor ve Dtor TemelleriÖzet - Basit Hesap Makinesi4Sınıf Özellikleri
Örnek ve Statik ÜyelerGetter ve Setter MetotlarıConst Üye FonksiyonlarMutable Anahtar KelimesiStatik Metotlar ve DeğişkenlerFriend Fonksiyonlar ve SınıflarÖzet - Banka Hesabı Yöneticisi7Kalıtım
Temel KalıtımKalıtım Erişim SeviyeleriCtor ve Dtor Çağrılma SırasıMetot Geçersiz KılmaSanal Fonksiyonlar ve VTableÇoklu KalıtımSanal KalıtımÖzet - Çalışan Hiyerarşisi10STL Genel Bakış
STL Genel Bakış ve FelsefesiSTL KonteynerleriİteratörlerSTL AlgoritmalarıFunctor'lar ve Lambda İfadeleriÖzet - Kelime Frekansı13Tasarım Kalıpları 1. Bölüm
Tasarım Kalıplarına GirişSingleton KalıbıFactory ve Abstract FactoryBuilder KalıbıObserver KalıbıStrategy Kalıbı2Bellek Yönetimi
Stack ve Heap Bellekİşaretçiler ve ReferanslarDinamik Bellek (new/delete)C++'ta Akıllı İşaretçilerC++'ta RAIIÖzet - Dinamik Dizi Yöneticisi5Kapsülleme
C++'da Erişim BelirleyicilerDerinlemesine Erişim BelirleyicilerBilgi GizlemeStruct vs Classİç İçe ve Dahili SınıflarÖzet - Öğrenci Kayıt Sistemi8Çok Biçimlilik
Derleme ve Çalışma Zamanı Çok BiçimliliğiFonksiyon Aşırı YüklemeSanal Fonksiyonlara Yeniden BakışSaf Sanal FonksiyonlarSoyut SınıflarC++'ta Arayüz TasarımıDynamic Casting ve RTTIÖzet - Şekil Hesaplayıcı3Yapıcılar ve Yıkıcılar
Varsayılan YapıcıParametreli YapıcıKopya YapıcıTaşıma YapıcısıYapıcı İlklendirme ListeleriTemsilci YapıcılarYıkıcılara Derinlemesine BakışÜç / Beş / Sıfır KuralıÖzet - String Sınıfı6Operatör Aşırı Yükleme
Operatör Aşırı Yüklemeye GirişAritmetik Operatör Aşırı YüklemeKarşılaştırma Operatörü Aşırı YüklemeStream OperatörleriAtama Operatörü Aşırı Yükleme[] ve () Operatör Aşırı YüklemeTip Dönüşüm OperatörleriÖzet - Matris Sınıfı9Şablonlar
Fonksiyon ŞablonlarıSınıf ŞablonlarıŞablon ÖzelleştirmeVariadic ŞablonlarSFINAE ve Type Traits TemelleriÖzet - Generic KonteynerKendi başına pratik yap: Online C++ derleyicisi