Menu
Coddy logo textTech

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.

challenge icon

Görev

Kolay

STL 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 ve std::sort kullanarak bunu artan düzende sıralayan sortScores adlı bir fonksiyon oluşturun.

    Bir const std::vector<int>& ve bir int hedef değer alan findScore adlı bir fonksiyon oluşturun. Hedefi aramak için std::find kullanın. Bulunursa, indeksi (başlangıçtan olan uzaklığı) döndürün. Bulunamazsa, -1 döndürün.

    Bir const std::vector<int>& ve bir int bonus miktarı alan applyBonus adlı bir fonksiyon oluşturun. Her puana bonusun eklendiği yeni bir vektör oluşturup döndürmek için std::transform kullanın.

    Bir const std::vector<int>& alan ve ortalamayı double olarak döndüren calculateAverage adlı bir fonksiyon oluşturun. Toplamı hesaplamak için std::accumulate kullanı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çen printVector adlı bir fonksiyon oluşturun.

  • main.cpp: Altı girdi okuyun (her biri ayrı bir satırda):
    1. Birinci puan (tam sayı)
    2. İkinci puan (tam sayı)
    3. Üçüncü puan (tam sayı)
    4. Dördüncü puan (tam sayı)
    5. Aranacak bir puan (tam sayı)
    6. Uygulanacak bir bonus miktarı (tam sayı)

    Dört puanla bir vektör oluşturun ve algoritmaları gösterin:

    1. Original: yazdırın ve ardından vektör içeriğini yazdırın
    2. Puanları sıralayın ve Sorted: yazdırın, ardından sıralanmış vektörü yazdırın
    3. Sıralanmış vektörde hedef puanı arayın. Bulunursa, Found <value> at index <index> yazdırın. Bulunamazsa, <value> not found yazdırın
    4. Sıralanmış puanlara bonusu uygulayın ve With bonus: yazdırın, ardından yeni vektörü yazdırın
    5. 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.5

100, 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.2

sort, 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;
}
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