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) ortalamaHı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.
Görev
KolayFarklı 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 birGradeManagersı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 eklergetGrade(const std::string& name)— map kullanarak verilen bir öğrenci ismi için notu döndürürprintRoster()— tüm öğrenci isimlerini eklendikleri sırayla (vector'den), her biri yeni bir satırda olacak şekilde yazdırırprintGrades()— tüm öğrencileri notlarıyla birlikte alfabetik sırayla (map bunu otomatik olarak halleder), her satırdaname: gradeformatında yazdırırprintUniqueGrades()— 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
- Öğrenci isimlerini eklendikleri sırayla saklamak için bir
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):
- Birinci öğrenci ismi
- Birinci öğrenci notu (tam sayı)
- İkinci öğrenci ismi
- İkinci öğrenci notu (tam sayı)
- Üçüncü öğrenci ismi
- Üçüncü öğrenci notu (tam sayı)
Bir
GradeManageroluşturun ve üç öğrenciyi de ekleyin. Ardından farklı konteyner davranışlarını gösterin:Roster (insertion order):yazdırın ve ardındanprintRoster()metodunu çağırınGrades (alphabetical):yazdırın ve ardındanprintGrades()metodunu çağırınUnique grades:yazdırın ve ardındanprintUniqueGrades()metodunu çağırın- İ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: 90Vector'ü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şimlist: Ortaya sık ekleme yapılması durumumap/set: Sıralı veri gerektiğindeunordered_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;
}
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 Konteyner