Menu
CoddyTech

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.

challenge icon

Tantangan

Mudah

Mari 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 class GradeManager yang menggunakan beberapa container STL untuk mengelola informasi siswa.

    Class-mu harus menggunakan:

    • std::vector<std::string> untuk menyimpan nama siswa sesuai urutan penambahannya
    • std::map<std::string, int> untuk mengaitkan setiap nama siswa dengan nilainya
    • std::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 container
    • getGrade(const std::string& name): mengembalikan nilai untuk nama siswa tertentu menggunakan map
    • printRoster(): mencetak semua nama siswa sesuai urutan penambahannya (dari vector), masing-masing pada baris baru
    • printGrades(): mencetak semua siswa beserta nilainya dalam urutan alfabetis (map mengaturnya secara otomatis), dengan format name: grade pada setiap baris
    • printUniqueGrades(): 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):

    1. Nama siswa pertama
    2. Nilai siswa pertama (bilangan bulat)
    3. Nama siswa kedua
    4. Nilai siswa kedua (bilangan bulat)
    5. Nama siswa ketiga
    6. Nilai siswa ketiga (bilangan bulat)

    Buat GradeManager dan tambahkan ketiga siswa. Lalu tunjukkan perilaku container yang berbeda:

    1. Cetak Roster (insertion order): lalu panggil printRoster()
    2. Cetak Grades (alphabetical): lalu panggil printGrades()
    3. Cetak Unique grades: lalu panggil printUniqueGrades()
    4. 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: 90

Perhatikan 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;
}
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Pemrograman Berorientasi Object

Latihan sendiri: Compiler C++ online