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 fonksiyonlarının birlikte nasıl çalıştığını gösteren yardımcı fonksiyonlar oluşturacaksınız.
Kodunuzu iki dosya halinde düzenleyeceksiniz:
ScoreAnalyzer.h: Tam sayı vektörlerini işlemek için STL algoritmalarını kullanan yardımcı fonksiyonları tanımlayın.Bir
std::vector<int>&alan vestd::sortkullanarak bunu artan düzende sıralayansortScoresadlı bir fonksiyon oluşturun.Bir
const std::vector<int>&ve birinthedef değer alanfindScoreadlı bir fonksiyon oluşturun. Hedefi aramak içinstd::findkullanın. Bulunursa, indeksi (başlangıçtan olan uzaklığı) döndürün. Bulunamazsa,-1döndürün.Bir
const std::vector<int>&ve birintbonus miktarı alanapplyBonusadlı bir fonksiyon oluşturun. Her puana bonusun eklendiği yeni bir vektör oluşturup döndürmek içinstd::transformkullanın.Bir
const std::vector<int>&alan ve ortalamayıdoubleolarak döndürencalculateAverageadlı bir fonksiyon oluşturun. Toplamı hesaplamak içinstd::accumulatekullanın, ardından boyuta bölün.Bir
const std::vector<int>&alan ve tüm öğeleri aralarında boşluk bırakarak yazdıran ve ardından bir alt satıra geçenprintVectoradlı bir fonksiyon oluşturun.main.cpp: Altı girdi okuyun (her biri ayrı bir satırda):- Birinci puan (tam sayı)
- İkinci puan (tam sayı)
- Üçüncü puan (tam sayı)
- Dördüncü puan (tam sayı)
- Aranacak bir puan (tam sayı)
- Uygulanacak bir bonus miktarı (tam sayı)
Dört puanla bir vektör oluşturun ve algoritmaları gösterin:
Original:yazdırın ve ardından vektör içeriğini yazdırın- Puanları sıralayın ve
Sorted:yazdırın, ardından sıralanmış vektörü yazdırın - Sıralanmış vektörde hedef puanı arayın. Bulunursa,
Found <value> at index <index>yazdırın. Bulunamazsa,<value> not foundyazdırın - Sıralanmış puanlara bonusu uygulayın ve
With bonus:yazdırın, ardından yeni vektörü yazdırın - Orijinal sıralanmış puanların (bonustan önceki) ortalamasını hesaplayın ve bir ondalık basamakla
Average: <value>olarak yazdırın
Örneğin, 75, 90, 60, 85, 85 ve 5 girdileriyle:
Original: 75 90 60 85
Sorted: 60 75 85 90
Found 85 at index 2
With bonus: 65 80 90 95
Average: 77.5100, 80, 95, 70, 50 ve 10 girdileriyle:
Original: 100 80 95 70
Sorted: 70 80 95 100
50 not found
With bonus: 80 90 105 110
Average: 86.2sort, find ve transform için <algorithm>, accumulate için <numeric> kütüphanelerini eklemeyi unutmayın. Ortalamayı biçimlendirmek için <iomanip> kütüphanesinden std::fixed ve std::setprecision(1) kullanın.
Kopya kağıdı
STL algoritmaları, yineleyiciler (iterators) tarafından tanımlanan aralıklar üzerinde çalışan <algorithm> ve <numeric> kütüphanelerinden şablon fonksiyonlardır.
std::sort öğ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 döndürür, 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 öğeye bir işlem uygular ve sonuçları bir hedef aralığa kaydeder:
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 yineleyici aralıklarıyla çalışır, bu da onları kısmi aralıklar veya farklı konteyner türleri için esnek hale getirir.
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 Konteyner