Menu
CoddyTech

Iterator

Termasuk bagian Pemrograman Berorientasi Object dalam perjalanan C++ di Coddy. Pelajaran 72 dari 104.

Iterator adalah object yang berfungsi sebagai jembatan antara wadah dan algoritma. Iterator menyediakan cara yang seragam untuk mengakses elemen dalam wadah apa pun, terlepas dari cara wadah tersebut menyimpan datanya secara internal. Anggap iterator sebagai pointer umum yang tahu cara bergerak melalui wadah.

Setiap container STL menyediakan method begin() dan end(). Iterator begin() menunjuk ke elemen pertama, sedangkan end() menunjuk ke posisi setelah elemen terakhir, yaitu sentinel yang menandai tempat untuk berhenti:

#include <vector>
#include <iostream>

int main() {
    std::vector<int> nums = {10, 20, 30};
    
    for (std::vector<int>::iterator it = nums.begin(); it != nums.end(); ++it) {
        std::cout << *it << " ";  // Lakukan dereferensi untuk mendapatkan nilai
    }
    // output: 10 20 30
}

Kata kunci auto sangat menyederhanakan deklarasi iterator:

for (auto it = nums.begin(); it != nums.end(); ++it) {
    *it *= 2;  // Ubah elemen melalui iterator
}
// nums sekarang berisi {20, 40, 60}

Iterator memiliki berbagai kategori berdasarkan kemampuannya. Iterator akses acak (seperti yang berasal dari vector) mendukung operasi aritmetika seperti it + 3 atau it1 - it2.

Iterator dua arah (dari list, map) dapat bergerak maju dan mundur dengan ++ dan --. Iterator maju hanya dapat bergerak ke satu arah.

Untuk penelusuran terbalik, gunakan rbegin() dan rend():

for (auto rit = nums.rbegin(); rit != nums.rend(); ++rit) {
    std::cout << *rit << " ";  // Mencetak dalam urutan terbalik
}
challenge icon

Tantangan

Mudah

Mari kita bangun sistem pelacakan inventaris yang menggunakan iterator untuk menelusuri dan memanipulasi kumpulan item. Kamu akan berlatih menggunakan berbagai tipe iterator untuk menavigasi data dengan beragam cara.

Kamu akan menyusun kodemu dalam dua file:

  • Inventory.h: Definisikan class Inventory yang mengelola kumpulan jumlah item yang disimpan dalam std::vector<int>.

    Class-mu harus menyediakan method berikut:

    • addItem(int quantity): menambahkan jumlah item ke inventaris
    • printForward(): menggunakan iterator dengan begin() dan end() untuk mencetak semua jumlah, dipisahkan oleh spasi, lalu diikuti baris baru
    • printReverse(): menggunakan reverse iterator dengan rbegin() dan rend() untuk mencetak semua jumlah dalam urutan terbalik, dipisahkan oleh spasi, lalu diikuti baris baru
    • doubleAll(): menggunakan iterator untuk menelusuri vector dan menggandakan setiap jumlah secara langsung
    • getTotal(): menggunakan iterator untuk menghitung dan mengembalikan jumlah seluruh nilai

    Gunakan kata kunci auto untuk deklarasi iterator agar kodemu tetap rapi.

  • main.cpp: Baca empat input bilangan bulat, masing-masing pada baris terpisah, yang mewakili jumlah item.

    Buat sebuah Inventory dan tambahkan keempat jumlah tersebut. Lalu, tunjukkan penggunaan iterator dengan cara:

    1. Mencetak Forward:, lalu memanggil printForward()
    2. Mencetak Reverse:, lalu memanggil printReverse()
    3. Mencetak Total: <sum> menggunakan getTotal()
    4. Memanggil doubleAll() untuk mengubah jumlah
    5. Mencetak After doubling:, lalu memanggil printForward()
    6. Mencetak New total: <sum> menggunakan getTotal()

Contohnya, dengan input 10, 25, 15, dan 30:

Forward: 10 25 15 30 
Reverse: 30 15 25 10 
Total: 80
After doubling: 20 50 30 60 
New total: 160

Tantangan ini memberimu kesempatan untuk berlatih membaca elemen melalui iterator, untuk mencetak dan menjumlahkan, serta mengubah elemen melalui iterator, untuk menggandakannya. Kamu juga akan melihat bagaimana reverse iterator memudahkan penelusuran mundur tanpa perlu memanipulasi indeks.

Coba sendiri

#include <iostream>
#include "Inventory.h"

using namespace std;

int main() {
    // Baca empat input bilangan bulat
    int q1, q2, q3, q4;
    cin >> q1;
    cin >> q2;
    cin >> q3;
    cin >> q4;

    // TODO: Buat object Inventory

    // TODO: Tambahkan keempat jumlah ke inventaris

    // TODO: Cetak "Forward: " lalu panggil printForward()

    // TODO: Cetak "Reverse: " lalu panggil printReverse()

    // TODO: Cetak "Total: " diikuti hasil getTotal()

    // TODO: Panggil doubleAll() untuk mengubah jumlahnya

    // TODO: Cetak "After doubling: " lalu panggil printForward()

    // TODO: Cetak "New total: " diikuti hasil getTotal()

    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