Algoritma STL
Termasuk bagian Pemrograman Berorientasi Object dalam perjalanan C++ di Coddy. Pelajaran 73 dari 104.
Algoritma STL adalah fungsi template yang bekerja pada rentang yang ditentukan oleh iterator. Algoritma ini terdapat di header <algorithm> dan <numeric>, serta bekerja dengan container apa pun yang menyediakan iterator yang kompatibel.
std::sort mengurutkan elemen dalam urutan menaik secara default:
#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 mencari nilai dan mengembalikan iterator ke kecocokan pertama, atau end() jika tidak ditemukan:
auto it = std::find(nums.begin(), nums.end(), 5);
if (it != nums.end()) {
std::cout << "Found at index: " << (it - nums.begin());
}std::transform menerapkan operasi pada setiap elemen dan menyimpan hasilnya dalam rentang tujuan:
std::vector<int> doubled(nums.size());
std::transform(nums.begin(), nums.end(), doubled.begin(),
[](int x) { return x * 2; });
// doubled: {2, 4, 10, 16}std::accumulate dari <numeric> menggabungkan semua elemen menjadi satu nilai:
#include <numeric>
int sum = std::accumulate(nums.begin(), nums.end(), 0);
// sum: 16 (1 + 2 + 5 + 8)Algoritma ini menerima rentang iterator, bukan container secara langsung, sehingga cukup fleksibel untuk bekerja pada rentang parsial atau berbagai jenis container dengan kode yang sama.
Tantangan
MudahMari buat penganalisis skor yang memproses sekumpulan angka menggunakan algoritma STL. Kamu akan membuat fungsi utilitas yang menunjukkan cara sort, find, transform, dan accumulate bekerja bersama untuk menganalisis data.
Kamu akan mengatur kodemu di dua file:
ScoreAnalyzer.h: Definisikan fungsi utilitas yang menggunakan algoritma STL untuk memproses vektor bilangan bulat.Buat fungsi bernama
sortScoresyang menerimastd::vector<int>&dan mengurutkannya secara menaik menggunakanstd::sort.Buat fungsi bernama
findScoreyang menerimaconst std::vector<int>&dan nilai target bertipeint. Gunakanstd::finduntuk mencari target. Jika ditemukan, kembalikan indeksnya (jarak dari begin). Jika tidak ditemukan, kembalikan-1.Buat fungsi bernama
applyBonusyang menerimaconst std::vector<int>&dan jumlah bonus bertipeint. Gunakanstd::transformuntuk membuat dan mengembalikan vektor baru yang setiap skornya ditambahkan dengan bonus tersebut.Buat fungsi bernama
calculateAverageyang menerimaconst std::vector<int>&dan mengembalikan rata-rata sebagaidouble. Gunakanstd::accumulateuntuk menghitung jumlahnya, lalu bagi dengan ukurannya.Buat fungsi bernama
printVectoryang menerimaconst std::vector<int>&dan mencetak semua elemennya, dipisahkan oleh spasi, lalu diakhiri dengan baris baru.main.cpp: Baca enam input (masing-masing pada baris terpisah):- Skor pertama (bilangan bulat)
- Skor kedua (bilangan bulat)
- Skor ketiga (bilangan bulat)
- Skor keempat (bilangan bulat)
- Skor yang ingin dicari (bilangan bulat)
- Jumlah bonus yang akan diterapkan (bilangan bulat)
Buat vektor berisi empat skor tersebut dan tunjukkan penggunaan algoritmanya:
- Cetak
Original:diikuti isi vektor - Urutkan skor, lalu cetak
Sorted:diikuti vektor yang sudah diurutkan - Cari skor target dalam vektor yang sudah diurutkan. Jika ditemukan, cetak
Found <value> at index <index>. Jika tidak ditemukan, cetak<value> not found - Terapkan bonus pada skor yang sudah diurutkan, lalu cetak
With bonus:diikuti vektor baru - Hitung dan cetak rata-rata skor awal yang sudah diurutkan (sebelum bonus) sebagai
Average: <value>dengan satu angka di belakang koma
Contohnya, dengan input 75, 90, 60, 85, 85, dan 5:
Original: 75 90 60 85
Sorted: 60 75 85 90
Found 85 at index 2
With bonus: 65 80 90 95
Average: 77.5Dengan input 100, 80, 95, 70, 50, dan 10:
Original: 100 80 95 70
Sorted: 70 80 95 100
50 not found
With bonus: 80 90 105 110
Average: 86.2Ingat untuk menyertakan <algorithm> untuk sort, find, dan transform, serta <numeric> untuk accumulate. Gunakan std::fixed dan std::setprecision(1) dari <iomanip> untuk memformat rata-rata.
Coba sendiri
#include <iostream>
#include <vector>
#include <iomanip>
#include "ScoreAnalyzer.h"
using namespace std;
int main() {
// Baca enam input
int score1, score2, score3, score4;
int searchTarget, bonusAmount;
cin >> score1;
cin >> score2;
cin >> score3;
cin >> score4;
cin >> searchTarget;
cin >> bonusAmount;
// TODO: Buat vector berisi empat skor
// TODO: Cetak "Original:" diikuti isi vector
// TODO: Urutkan skor dan cetak "Sorted:" diikuti vector yang sudah diurutkan
// TODO: Cari skor target dalam vector yang sudah diurutkan
// Jika ditemukan, cetak "Found <value> at index <index>"
// Jika tidak ditemukan, cetak "<value> not found"
// TODO: Tambahkan bonus ke skor yang sudah diurutkan dan cetak "With bonus:" diikuti vector baru
// TODO: Hitung dan cetak rata-rata skor yang sudah diurutkan (sebelum bonus)
// Gunakan fixed dan setprecision(1) untuk memformat output
// Cetak dengan format "Average: <value>"
return 0;
}
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Pemrograman Berorientasi Object
1Dasar-Dasar OOP
File EksternalBuild dan Kompilasi C++File Header dan File SourceNamespace dan CakupanPengantar OOP dalam C++class vs objectPointer 'this'method (Fungsi Anggota)Atribut (Anggota Data)Dasar Ctor dan DtorRingkasan: Kalkulator Sederhana4Properti class
Anggota instance vs staticGetter dan setterFungsi anggota constKata kunci mutableMethod dan variabel staticFungsi dan class friendRangkuman, Pengelola Rekening Bank7Pewarisan
Pewarisan DasarTingkat Akses pada PewarisanUrutan Pemanggilan Ctor & DtorPenimpaan methodFungsi Virtual & VTablePewarisan BergandaPewarisan VirtualRangkuman: Hierarki Karyawan10Gambaran Umum STL
Gambaran Umum dan Filosofi STLKontainer STLIteratorAlgoritma STLFunctor dan Ekspresi LambdaRangkuman: Frekuensi Kata2Manajemen Memori
Memori Stack vs HeapPointer dan ReferenceMemori Dinamis (new/delete)Smart Pointer di C++RAII di C++Rangkuman: Pengelola Array Dinamis5Enkapsulasi
Penentu Akses dalam C++Penentu Akses secara MendalamPenyembunyian Informasistruct vs classNested dan Inner classRangkuman, Sistem Catatan Siswa8Polimorfisme
Polimorfisme saat Compile vs RuntimeOverloading FungsiMeninjau Kembali Fungsi VirtualFungsi Virtual MurniKelas AbstrakDesain Interface di C++Casting Dinamis & RTTIRangkuman: Kalkulator Bentuk3Konstruktor & Destruktor
Konstruktor DefaultKonstruktor BerparameterKonstruktor SalinKonstruktor PindahDaftar Inisialisasi KonstruktorKonstruktor DelegasiKupas Tuntas DestruktorAturan Tiga, Lima, dan NolRangkuman: class String6Overloading Operator
Pengantar Overloading OperatorOverloading Operator AritmetikaOverloading Operator PerbandinganOperator StreamOverloading Operator PenugasanOverloading Operator [] dan ()Operator Konversi TipeRingkasan, class Matrix9Template
Template FungsiTemplate classSpesialisasi TemplateTemplate VariadikDasar SFINAE & Type TraitsRangkuman, Container GenerikLatihan sendiri: Compiler C++ online