Kontainer STL
Termasuk bagian Pemrograman Berorientasi Object dalam perjalanan C++ di Coddy. Pelajaran 71 dari 104.
Container STL adalah class template yang menyimpan dan mengatur kumpulan object. Setiap tipe container dioptimalkan untuk pola akses dan operasi yang berbeda. Memilih container yang tepat sesuai kebutuhanmu dapat berdampak signifikan pada performa programmu.
Kontainer sekuensial mempertahankan elemen dalam urutan tertentu:
#include <vector>
#include <list>
std::vector<int> vec = {1, 2, 3}; // array dinamis, akses acak cepat
vec.push_back(4); // Tambahkan ke akhir: O(1) teramortisasi
int x = vec[2]; // Akses berdasarkan indeks: O(1)
std::list<int> lst = {1, 2, 3}; // list tertaut ganda
lst.push_front(0); // Tambahkan ke depan: O(1)
lst.push_back(4); // Tambahkan ke akhir: O(1)Kontainer asosiatif menyimpan elemen dalam urutan terurut agar pencarian lebih cepat:
#include <map>
#include <set>
std::set<int> s = {3, 1, 4, 1}; // Elemen unik yang terurut: {1, 3, 4}
s.insert(2); // Sisipkan: O(log n)
bool found = s.count(3); // Periksa keberadaan: O(log n)
std::map<std::string, int> ages; // Pasangan kunci-nilai, diurutkan berdasarkan kunci
ages["Alice"] = 25; // Sisipkan/perbarui: O(log n)
ages["Bob"] = 30;
std::cout << ages["Alice"]; // Akses: O(log n)Kontainer tanpa urutan menggunakan tabel hash untuk pencarian rata-rata yang jauh lebih cepat:
#include <unordered_map>
std::unordered_map<std::string, int> scores;
scores["player1"] = 100; // Sisipkan: rata-rata O(1)
scores["player2"] = 200;
std::cout << scores["player1"]; // Akses: rata-rata O(1)Gunakan vector saat kamu membutuhkan akses acak yang cepat, list untuk penyisipan yang sering di bagian tengah, map/set saat kamu membutuhkan data yang terurut, dan unordered_map saat kecepatan pencarian sangat penting dan urutan tidak menjadi masalah.
Tantangan
MudahMari buat sistem pengelolaan nilai siswa yang menunjukkan bagaimana container STL yang berbeda memiliki kegunaan masing-masing. Kamu akan menggunakan beberapa tipe container untuk mengatur data siswa secara efisien, dengan memilih container yang tepat untuk setiap tugas.
Kamu akan membuat dua file untuk mengatur kodemu:
GradeManager.h: Definisikan classGradeManageryang menggunakan beberapa container STL untuk mengelola informasi siswa.Class-mu harus menggunakan:
std::vector<std::string>untuk menyimpan nama siswa sesuai urutan penambahannyastd::map<std::string, int>untuk mengaitkan setiap nama siswa dengan nilainyastd::set<int>untuk melacak semua nilai unik yang telah diberikan
Implementasikan method berikut:
addStudent(const std::string& name, int grade): menambahkan siswa beserta nilainya ke ketiga containergetGrade(const std::string& name): mengembalikan nilai untuk nama siswa tertentu menggunakan mapprintRoster(): mencetak semua nama siswa sesuai urutan penambahannya (dari vector), masing-masing pada baris baruprintGrades(): mencetak semua siswa beserta nilainya dalam urutan alfabetis (map mengaturnya secara otomatis), dengan formatname: gradepada setiap barisprintUniqueGrades(): mencetak semua nilai unik dalam urutan menaik (set mengaturnya), dipisahkan dengan spasi dan diikuti baris baru
main.cpp: Baca input dan tunjukkan bagaimana setiap tipe container memiliki kegunaan yang berbeda.Baca enam input (masing-masing pada baris terpisah):
- Nama siswa pertama
- Nilai siswa pertama (bilangan bulat)
- Nama siswa kedua
- Nilai siswa kedua (bilangan bulat)
- Nama siswa ketiga
- Nilai siswa ketiga (bilangan bulat)
Buat
GradeManagerdan tambahkan ketiga siswa. Lalu tunjukkan perilaku container yang berbeda:- Cetak
Roster (insertion order):lalu panggilprintRoster() - Cetak
Grades (alphabetical):lalu panggilprintGrades() - Cetak
Unique grades:lalu panggilprintUniqueGrades() - Cari nilai siswa kedua dan cetak
<name>'s grade: <grade>
Contohnya, dengan input Charlie, 85, Alice, 90, Bob, 85:
Roster (insertion order):
Charlie
Alice
Bob
Grades (alphabetical):
Alice: 90
Bob: 85
Charlie: 85
Unique grades:
85 90
Alice's grade: 90Perhatikan bagaimana vector mempertahankan urutan penambahan (Charlie, Alice, Bob), map otomatis mengurutkan berdasarkan kunci (Alice, Bob, Charlie), dan set hanya menyimpan nilai unik dalam urutan terurut (85 muncul sekali, bukan dua kali). Setiap tipe container memiliki keunggulan untuk tugas yang berbeda!
Coba sendiri
#include <iostream>
#include <string>
#include "GradeManager.h"
using namespace std;
int main() {
// Baca input untuk tiga siswa
string name1, name2, name3;
int grade1, grade2, grade3;
cin >> name1;
cin >> grade1;
cin >> name2;
cin >> grade2;
cin >> name3;
cin >> grade3;
// TODO: Buat object GradeManager
// TODO: Tambahkan ketiga siswa ke GradeManager
// TODO: Cetak "Roster (insertion order):" dan panggil printRoster()
// TODO: Cetak "Grades (alphabetical):" dan panggil printGrades()
// TODO: Cetak "Unique grades:" dan panggil printUniqueGrades()
// TODO: Cari nilai siswa kedua dan cetak "<name>'s grade: <grade>"
return 0;
}
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Pemrograman Berorientasi Object
1Dasar-Dasar OOP
File EksternalBuild dan Kompilasi C++File Header dan File SourceNamespace dan CakupanPengantar OOP dalam C++class vs objectPointer 'this'method (Fungsi Anggota)Atribut (Anggota Data)Dasar Ctor dan DtorRingkasan: Kalkulator Sederhana4Properti class
Anggota instance vs staticGetter dan setterFungsi anggota constKata kunci mutableMethod dan variabel staticFungsi dan class friendRangkuman, Pengelola Rekening Bank7Pewarisan
Pewarisan DasarTingkat Akses pada PewarisanUrutan Pemanggilan Ctor & DtorPenimpaan methodFungsi Virtual & VTablePewarisan BergandaPewarisan VirtualRangkuman: Hierarki Karyawan10Gambaran Umum STL
Gambaran Umum dan Filosofi STLKontainer STLIteratorAlgoritma STLFunctor dan Ekspresi LambdaRangkuman: Frekuensi Kata2Manajemen Memori
Memori Stack vs HeapPointer dan ReferenceMemori Dinamis (new/delete)Smart Pointer di C++RAII di C++Rangkuman: Pengelola Array Dinamis5Enkapsulasi
Penentu Akses dalam C++Penentu Akses secara MendalamPenyembunyian Informasistruct vs classNested dan Inner classRangkuman, Sistem Catatan Siswa8Polimorfisme
Polimorfisme saat Compile vs RuntimeOverloading FungsiMeninjau Kembali Fungsi VirtualFungsi Virtual MurniKelas AbstrakDesain Interface di C++Casting Dinamis & RTTIRangkuman: Kalkulator Bentuk3Konstruktor & Destruktor
Konstruktor DefaultKonstruktor BerparameterKonstruktor SalinKonstruktor PindahDaftar Inisialisasi KonstruktorKonstruktor DelegasiKupas Tuntas DestruktorAturan Tiga, Lima, dan NolRangkuman: class String6Overloading Operator
Pengantar Overloading OperatorOverloading Operator AritmetikaOverloading Operator PerbandinganOperator StreamOverloading Operator PenugasanOverloading Operator [] dan ()Operator Konversi TipeRingkasan, class Matrix9Template
Template FungsiTemplate classSpesialisasi TemplateTemplate VariadikDasar SFINAE & Type TraitsRangkuman, Container GenerikLatihan sendiri: Compiler C++ online