Menu
Coddy logo textTech

İteratörler

Coddy'nin C++ Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 72 / 104.

İteratörler, kapsayıcılar ve algoritmalar arasında köprü görevi gören nesnelerdir. Bir kapsayıcının verilerini dahili olarak nasıl depoladığından bağımsız olarak, herhangi bir kapsayıcıdaki öğelere erişmek için tek tip bir yol sağlarlar. İteratörü, bir kapsayıcı içinde nasıl ilerleyeceğini bilen genelleştirilmiş bir işaretçi olarak düşünebilirsin.

Her STL konteyneri begin() ve end() yöntemlerini sağlar. begin() yineleyicisi ilk öğeyi gösterirken, end() son öğeden bir sonraki konumu gösterir; bu, nerede durulacağını belirleyen bir nöbetçidir:

#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 << " ";  // Değeri almak için referansı kaldır
    }
    // Çıktı: 10 20 30
}

auto anahtar sözcüğü, yineleyici bildirimlerini önemli ölçüde basitleştirir:

for (auto it = nums.begin(); it != nums.end(); ++it) {
    *it *= 2;  // Öğeleri iterator aracılığıyla değiştir
}
// nums artık {20, 40, 60}

Iteratorler, yeteneklerine göre farklı kategorilere ayrılır. Rastgele erişim iteratorleri (vector gibi) it + 3 veya it1 - it2 gibi aritmetik işlemleri destekler.

Çift yönlü yineleyiciler (list, map için) ++ ve -- ile ileri ve geri hareket edebilir. İleri yönlü yineleyiciler yalnızca tek yönde hareket edebilir.

Tersine dolaşım için rbegin() ve rend() kullanın:

for (auto rit = nums.rbegin(); rit != nums.rend(); ++rit) {
    std::cout << *rit << " ";  // Ters sırada yazdırır
}
challenge icon

Görev

Kolay

Öğelerin koleksiyonlarında gezinmek ve bu koleksiyonları değiştirmek için yineleyicileri kullanan bir envanter takip sistemi oluşturalım. Veriler arasında çeşitli şekillerde gezinmek için farklı yineleyici türlerini kullanma pratiği yapacaksın.

Kodunu iki dosya arasında düzenleyeceksin:

  • Inventory.h: Inventory içinde depolanan öğe miktarlarından oluşan bir koleksiyonu yöneten bir std::vector<int> sınıfı tanımla.

    Sınıfın şu yöntemleri sağlamalıdır:

    • addItem(int quantity): envantere bir öğe miktarı ekler
    • printForward(): tüm miktarları aralarında boşluk olacak şekilde ve ardından yeni satır gelecek biçimde yazdırmak için begin() ve end() ile yineleyicileri kullanır
    • printReverse(): tüm miktarları ters sırada, aralarında boşluk olacak şekilde ve ardından yeni satır gelecek biçimde yazdırmak için rbegin() ve rend() ile ters yineleyicileri kullanır
    • doubleAll(): vektörde gezinmek ve her miktarı yerinde iki katına çıkarmak için yineleyicileri kullanır
    • getTotal(): tüm miktarların toplamını hesaplamak ve döndürmek için yineleyicileri kullanır

    Kodun daha temiz olması için yineleyici bildirimlerinde auto anahtar sözcüğünü kullan.

  • main.cpp: Her biri ayrı bir satırda olacak şekilde, öğe miktarlarını temsil eden dört tam sayı girdisi oku.

    Bir Inventory oluştur ve dört miktarın tümünü ekle. Ardından yineleyici kullanımını şu şekilde göster:

    1. Forward: yazdır ve ardından printForward() çağrısını yap
    2. Reverse: yazdır ve ardından printReverse() çağrısını yap
    3. Total: <sum> kullanarak getTotal() yazdır
    4. Miktarları değiştirmek için doubleAll() çağrısını yap
    5. After doubling: yazdır ve ardından printForward() çağrısını yap
    6. New total: <sum> kullanarak getTotal() yazdır

Örneğin girdiler 10, 25, 15 ve 30 olduğunda:

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

Bu görev, hem yineleyiciler aracılığıyla öğeleri okumayı (yazdırma ve toplama için) hem de yineleyiciler aracılığıyla öğeleri değiştirmeyi (iki katına çıkarma için) uygulamana olanak tanır. Ayrıca ters yineleyicilerin, herhangi bir dizin işlemesine gerek kalmadan geriye doğru gezinmeyi nasıl kolaylaştırdığını da göreceksin.

Kendin dene

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

using namespace std;

int main() {
    // Dört tamsayı girdisi oku
    int q1, q2, q3, q4;
    cin >> q1;
    cin >> q2;
    cin >> q3;
    cin >> q4;

    // TODO: Bir Inventory nesnesi oluştur

    // TODO: Dört miktarın hepsini envantere ekle

    // TODO: "Forward: " yazdır sonra printForward() çağır

    // TODO: "Reverse: " yazdır sonra printReverse() çağır

    // TODO: "Total: " yazdır ardından getTotal() sonucunu

    // TODO: Miktarları değiştirmek için doubleAll() çağır

    // TODO: Print "After doubling: " then call printForward()

    // TODO: "New total: " yazdır ardından getTotal() sonucunu

    return 0;
}
quiz iconKendini test et

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

Kendi başına pratik yap: Online C++ derleyicisi