Pengikatan Terstruktur
Termasuk bagian Pemrograman Berorientasi Object dalam perjalanan C++ di Coddy. Pelajaran 88 dari 104.
Binding terstruktur, yang diperkenalkan di C++17, memungkinkan kamu membongkar beberapa nilai dari array, pair, tuple, atau struct menjadi variabel bernama secara terpisah dalam satu deklarasi. Ini membuat kodemu lebih rapi dan mudah dibaca saat bekerja dengan data komposit.
Sintaks menggunakan auto dengan tanda kurung siku yang berisi nama variabel baru:
#include <iostream>
#include <map>
#include <tuple>
int main() {
// Membongkar pair
std::pair<std::string, int> person{"Alice", 25};
auto [name, age] = person;
std::cout << name << " is " << age << "\n";
// Membongkar tuple
std::tuple<int, double, char> data{42, 3.14, 'X'};
auto [num, pi, letter] = data;
// Membongkar nilai dalam for loop berbasis rentang
std::map<std::string, int> scores{{"Bob", 90}, {"Carol", 85}};
for (const auto& [student, score] : scores) {
std::cout << student << ": " << score << "\n";
}
}Structured bindings juga berfungsi dengan array dan struct kustom yang memiliki member publik:
struct Point {
double x;
double y;
};
Point getOrigin() { return {0.0, 0.0}; }
int main() {
auto [x, y] = getOrigin();
int arr[3] = {1, 2, 3};
auto [a, b, c] = arr;
}Kamu bisa menggunakan auto& atau const auto& untuk mengikat dengan referensi, sehingga menghindari penyalinan dan memungkinkan kamu memodifikasi nilai asli saat diperlukan. Fitur ini sangat berguna saat melakukan iterasi pada container STL atau menangani fungsi yang mengembalikan beberapa nilai.
Tantangan
MudahMari buat penganalisis nilai siswa yang menunjukkan keunggulan structured bindings. Kamu akan membuat sistem yang memproses catatan siswa dan data mata pelajaran, menggunakan structured bindings untuk membongkar pair, tuple, dan struct dengan rapi di seluruh kodemu.
Kamu akan mengatur kodemu dalam tiga file:
Student.h: Definisikan structStudentdengan anggota publik untuk nama siswa (std::string), ID (int), dan GPA (double). Buat juga fungsi bernamacreateStudentyang menerima nama, ID, dan GPA, lalu mengembalikan structStudent.GradeUtils.h: Buat fungsi utilitas untuk memproses nilai.Definisikan fungsi
getGradeInfoyang menerima nilai numerik (integer) dan mengembalikanstd::tupleyang berisi tiga nilai: nilai huruf (std::string), poin nilai (double), dan apakah siswa lulus (bool). Gunakan skala penilaian berikut:- 90+ : "A", 4.0, true
- 80-89: "B", 3.0, true
- 70-79: "C", 2.0, true
- 60-69: "D", 1.0, true
- Di bawah 60: "F", 0.0, false
Definisikan juga fungsi
makeScorePairyang menerima nama mata pelajaran (std::string) dan nilai (int), lalu mengembalikanstd::pairyang berisi kedua nilai tersebut.main.cpp: Baca empat input:- Nama siswa (string)
- ID siswa (integer)
- Nama mata pelajaran (string)
- Nilai (integer)
Gunakan structured bindings di seluruh fungsi main-mu:
- Panggil
createStudentdengan nama, ID, dan GPA placeholder sebesar 0.0. Gunakan structured bindings untuk membongkar struct yang dikembalikan menjadi variabel-variabel tersendiri, lalu cetak:Student: [name] (ID: [id]) - Panggil
makeScorePairdengan nama mata pelajaran dan nilai. Gunakan structured bindings untuk membongkar pair, lalu cetak:Course: [course], Score: [score] - Panggil
getGradeInfodengan nilai. Gunakan structured bindings untuk membongkar ketiga elemen tuple, lalu cetak:(Cetak "yes" jika siswa lulus bernilai true, "no" jika false)Grade: [letter] Points: [points] Passing: [yes/no]
Contohnya, dengan input Alice, 1001, Math, dan 85:
Student: Alice (ID: 1001)
Course: Math, Score: 85
Grade: B
Points: 3
Passing: yesDengan input Bob, 2002, Physics, dan 55:
Student: Bob (ID: 2002)
Course: Physics, Score: 55
Grade: F
Points: 0
Passing: noIngat untuk menyertakan <tuple> dan <utility> jika diperlukan. Inti pentingnya adalah structured bindings memungkinkan kamu membongkar tipe komposit, pair, tuple, dan struct menjadi variabel bernama dalam satu deklarasi yang mudah dibaca.
Coba sendiri
#include <iostream>
#include <string>
#include "Student.h"
#include "GradeUtils.h"
int main() {
// Baca input
std::string studentName;
int studentId;
std::string courseName;
int score;
std::cin >> studentName;
std::cin >> studentId;
std::cin >> courseName;
std::cin >> score;
// TODO: Panggil createStudent dengan nama, id, dan GPA sementara bernilai 0.0
// Gunakan binding terstruktur untuk menguraikan struct: auto [name, id, gpa] = ...
// Cetak: Student: [name] (ID: [id])
// TODO: Panggil makeScorePair dengan nama kursus dan skor
// Gunakan binding terstruktur untuk menguraikan pair: auto [course, sc] = ...
// Cetak: Course: [course], Score: [score]
// TODO: Panggil getGradeInfo dengan skor
// Gunakan binding terstruktur untuk menguraikan tuple: auto [letter, points, passing] = ...
// Cetak:
// Grade: [letter]
// Points: [points]
// Lulus: [yes/no] (cetak "yes" jika passing bernilai true, "no" jika false)
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 Karyawan2Manajemen 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 Generik12Fitur Modern C++
Semantik Pemindahan & RvaluePenerusan SempurnaEkspresi Lambda secara Mendalamstd::function & std::bindconstexpr dan constevalPengikatan Terstrukturoptional, variant, anyLatihan sendiri: Compiler C++ online