İ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
}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:Inventoryiçinde depolanan öğe miktarlarından oluşan bir koleksiyonu yöneten birstd::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ı eklerprintForward(): tüm miktarları aralarında boşluk olacak şekilde ve ardından yeni satır gelecek biçimde yazdırmak içinbegin()veend()ile yineleyicileri kullanırprintReverse(): tüm miktarları ters sırada, aralarında boşluk olacak şekilde ve ardından yeni satır gelecek biçimde yazdırmak içinrbegin()verend()ile ters yineleyicileri kullanırdoubleAll(): vektörde gezinmek ve her miktarı yerinde iki katına çıkarmak için yineleyicileri kullanırgetTotal(): tüm miktarların toplamını hesaplamak ve döndürmek için yineleyicileri kullanır
Kodun daha temiz olması için yineleyici bildirimlerinde
autoanahtar 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
Inventoryoluştur ve dört miktarın tümünü ekle. Ardından yineleyici kullanımını şu şekilde göster:Forward:yazdır ve ardındanprintForward()çağrısını yapReverse:yazdır ve ardındanprintReverse()çağrısını yapTotal: <sum>kullanarakgetTotal()yazdır- Miktarları değiştirmek için
doubleAll()çağrısını yap After doubling:yazdır ve ardındanprintForward()çağrısını yapNew total: <sum>kullanarakgetTotal()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: 160Bu 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;
}
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 KonteynerKendi başına pratik yap: Online C++ derleyicisi