STL Algoritmaları
Coddy'nin C++ Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 73 / 104.
STL algoritmaları, iteratörler tarafından tanımlanan aralıklar üzerinde işlem yapan şablon fonksiyonlardır. <algorithm> ve <numeric> başlık dosyalarında bulunurlar ve uyumlu iteratörler sağlayan herhangi bir konteyner ile çalışırlar.
std::sort varsayılan olarak öğeleri artan düzende sıralar:
#include <algorithm>
#include <vector>
std::vector<int> nums = {5, 2, 8, 1};
std::sort(nums.begin(), nums.end());
// nums: {1, 2, 5, 8}std::find bir değeri arar ve ilk eşleşmeye bir yineleyici (iterator) döndürür, veya bulunamazsa end() döndürür:
auto it = std::find(nums.begin(), nums.end(), 5);
if (it != nums.end()) {
std::cout << "Found at index: " << (it - nums.begin());
}std::transform her bir öğeye bir işlem uygular ve sonuçları bir hedef aralıkta saklar:
std::vector<int> doubled(nums.size());
std::transform(nums.begin(), nums.end(), doubled.begin(),
[](int x) { return x * 2; });
// doubled: {2, 4, 10, 16}<numeric> başlığındaki std::accumulate, tüm öğeleri tek bir değerde birleştirir:
#include <numeric>
int sum = std::accumulate(nums.begin(), nums.end(), 0);
// sum: 16 (1 + 2 + 5 + 8)Bu algoritmalar, doğrudan konteynerler yerine yineleyici aralıklarını (iterator ranges) kabul eder; bu da onları kısmi aralıklar veya aynı kodla farklı konteyner türleri üzerinde çalışacak kadar esnek hale getirir.
Görev
KolaySTL algoritmalarını kullanarak bir sayı koleksiyonunu işleyen bir puan analizörü oluşturalım. Verileri analiz etmek için sort, find, transform ve accumulate algoritmalarının birlikte nasıl çalıştığını gösteren yardımcı işlevler oluşturacaksın.
Kodunu iki dosya arasında düzenleyeceksin:
ScoreAnalyzer.h: Tamsayı vektörlerini işlemek için STL algoritmalarını kullanan yardımcı işlevleri tanımla.sortScoresalan vestd::vector<int>&kullanarak vektörü artan düzende sıralayanstd::sortadlı bir işlev oluştur.findScoreve birconst std::vector<int>&hedef değeri alanintadlı bir işlev oluştur. Hedefi aramak içinstd::findkullan. Bulunursa dizini (başlangıçtan olan uzaklığı) döndür. Bulunamazsa-1döndür.applyBonusve birconst std::vector<int>&bonus miktarı alanintadlı bir işlev oluştur. Her puana bonusun eklendiği yeni bir vektör oluşturup döndürmek içinstd::transformkullan.calculateAveragealan ve ortalamayıconst std::vector<int>&olarak döndürendoubleadlı bir işlev oluştur. Toplamı hesaplamak içinstd::accumulatekullan, ardından boyuta böl.printVectoralan ve tüm elemanları aralarında boşluk olacak şekilde, ardından bir yeni satır karakteriyle yazdıranconst std::vector<int>&adlı bir işlev oluştur.main.cpp: Altı girdi oku (her biri ayrı bir satırda):- Birinci puan (tamsayı)
- İkinci puan (tamsayı)
- Üçüncü puan (tamsayı)
- Dördüncü puan (tamsayı)
- Aranacak bir puan (tamsayı)
- Uygulanacak bonus miktarı (tamsayı)
Dört puandan oluşan bir vektör oluştur ve algoritmaları göster:
- Vektör içeriğinden önce
Original:yazdır - Puanları sırala ve sıralanmış vektörden önce
Sorted:yazdır - Sıralanmış vektörde hedef puanı ara. Bulunursa
Found <value> at index <index>yazdır. Bulunamazsa<value> not foundyazdır - Sıralanmış puanlara bonusu uygula ve yeni vektörden önce
With bonus:yazdır - Bonus uygulanmadan önceki özgün sıralanmış puanların ortalamasını hesapla ve bir ondalık basamakla
Average: <value>olarak yazdır
Örneğin, girdiler 75, 90, 60, 85, 85 ve 5 olduğunda:
Original: 75 90 60 85
Sorted: 60 75 85 90
Found 85 at index 2
With bonus: 65 80 90 95
Average: 77.5Girdiler 100, 80, 95, 70, 50 ve 10 olduğunda:
Original: 100 80 95 70
Sorted: 70 80 95 100
50 not found
With bonus: 80 90 105 110
Average: 86.2<algorithm>, sort ve find için transform; <numeric> için ise accumulate eklemeyi unutma. Ortalamayı biçimlendirmek için std::fixed içindeki std::setprecision(1) ve <iomanip> kullan.
Kendin dene
#include <iostream>
#include <vector>
#include <iomanip>
#include "ScoreAnalyzer.h"
using namespace std;
int main() {
// Altı girişi oku
int score1, score2, score3, score4;
int searchTarget, bonusAmount;
cin >> score1;
cin >> score2;
cin >> score3;
cin >> score4;
cin >> searchTarget;
cin >> bonusAmount;
// TODO: Dört puanı içeren bir vector oluşturun
// TODO: "Original:" yazdırın ve ardından vector içeriğini yazdırın
// TODO: Puanları sıralayın ve "Sorted:" yazdırın, ardından sıralanmış vector'ü yazdırın
// TODO: Sıralanmış vector içinde hedef puanı arayın
// Eğer bulunursa, "Found <value> at index <index>" yazdırın
// Eğer bulunamazsa, "<value> not found" yazdırın
// TODO: Sıralanmış puanlara bonusu uygulayın ve "With bonus:" yazdırın, ardından yeni vector'ü yazdırın
// TODO: Sıralanmış puanların ortalamasını (bonustan önce) hesaplayın ve yazdırın
// Biçimlendirme için fixed ve setprecision(1) kullanın
// "Average: <value>" şeklinde yazdırın
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