Langsung ke konten
KamusNgoding
Menengah Cpp 3 menit baca

Array dan Vector di C++: Mengelola Kumpulan Data

#cpp #array #vector #stl #koleksi #iterator #range-based-for

Ketika kamu perlu menyimpan banyak nilai bertipe sama — daftar nilai mahasiswa, koordinat peta, atau harga produk — kamu butuh struktur data koleksi. C++ memiliki dua pilihan utama: array (ukuran tetap, performa maksimal) dan vector (ukuran dinamis, lebih fleksibel). Memahami perbedaan dan kapan menggunakan keduanya adalah keterampilan penting setiap programmer C++.

Array: Koleksi dengan Ukuran Tetap

Deklarasi dan Inisialisasi

#include <iostream>
using namespace std;

int main() {
    // Array dengan ukuran tetap
    int nilai[5] = {85, 92, 78, 95, 88};

    // Akses elemen (indeks mulai dari 0)
    cout << nilai[0] << endl; // Output: 85
    cout << nilai[4] << endl; // Output: 88

    // Ubah nilai
    nilai[2] = 80;
    cout << nilai[2] << endl; // Output: 80

    // nilai[5] = 100; // ❌ Undefined behavior — indeks di luar batas!

    return 0;
}

Iterasi Array

int angka[] = {10, 20, 30, 40, 50};
int jumlah = 5; // atau: sizeof(angka) / sizeof(angka[0])

// Cara 1: for biasa
for (int i = 0; i < jumlah; i++) {
    cout << angka[i] << " ";
}
cout << endl;
// Output: 10 20 30 40 50

// Cara 2: range-based for (C++11) — lebih bersih
for (int n : angka) {
    cout << n << " ";
}
cout << endl;
// Output: 10 20 30 40 50

Menghitung Ukuran Array

int data[] = {1, 2, 3, 4, 5, 6, 7};

// sizeof memberikan total byte, bukan jumlah elemen
int ukuran = sizeof(data) / sizeof(data[0]);
cout << "Jumlah elemen: " << ukuran << endl;
// Output: Jumlah elemen: 7

Array Multidimensi

// Matrix 3x3
int matrix[3][3] = {
    {1, 2, 3},
    {4, 5, 6},
    {7, 8, 9}
};

// Akses elemen: matrix[baris][kolom]
cout << matrix[1][2] << endl; // Output: 6

// Iterasi matrix
for (int i = 0; i < 3; i++) {
    for (int j = 0; j < 3; j++) {
        cout << matrix[i][j] << "\t";
    }
    cout << endl;
}
// Output:
// 1    2    3
// 4    5    6
// 7    8    9

std::vector: Array yang Lebih Fleksibel

Array biasa memiliki kelemahan utama: ukurannya tetap dan harus diketahui saat kompilasi. std::vector mengatasi ini — ukurannya bisa berubah saat program berjalan.

#include <iostream>
#include <vector>
using namespace std;

int main() {
    // Membuat vector kosong
    vector<int> angka;

    // Menambahkan elemen
    angka.push_back(10);
    angka.push_back(20);
    angka.push_back(30);

    // Atau inisialisasi langsung
    vector<string> buah = {"Apel", "Mangga", "Jeruk"};

    // Akses elemen
    cout << buah[0] << endl;      // Output: Apel
    cout << buah.at(1) << endl;   // Output: Mangga (.at() memeriksa batas!)

    // Ukuran vector
    cout << buah.size() << endl;  // Output: 3

    return 0;
}

Operasi Dasar Vector

vector<int> v = {5, 3, 8, 1, 9, 2};

// Tambah di akhir
v.push_back(7);

// Hapus elemen terakhir
v.pop_back();

// Insert di posisi tertentu (iterator)
v.insert(v.begin() + 2, 100); // Insert 100 di indeks 2

// Hapus elemen di posisi tertentu
v.erase(v.begin() + 1); // Hapus elemen di indeks 1

// Cek apakah kosong
if (!v.empty()) {
    cout << "Elemen pertama: " << v.front() << endl;
    cout << "Elemen terakhir: " << v.back() << endl;
}

// Kosongkan semua elemen
v.clear();
cout << "Ukuran setelah clear: " << v.size() << endl;
// Output: Ukuran setelah clear: 0

Iterasi Vector

vector<string> kota = {"Jakarta", "Surabaya", "Bandung", "Medan"};

// Range-based for (direkomendasikan)
for (const string& k : kota) {
    cout << k << endl;
}
// Output: Jakarta, Surabaya, Bandung, Medan

// Dengan indeks
for (int i = 0; i < kota.size(); i++) {
    cout << i + 1 << ". " << kota[i] << endl;
}

Gunakan const string& saat iterasi read-only — ini mencegah penyalinan string yang tidak perlu dan lebih efisien untuk tipe data besar.

Algoritma dengan Vector dan <algorithm>

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int main() {
    vector<int> nilai = {85, 92, 78, 95, 88, 72, 91};

    // Urutkan (ascending)
    sort(nilai.begin(), nilai.end());
    // nilai: {72, 78, 85, 88, 91, 92, 95}

    // Urutkan (descending)
    sort(nilai.begin(), nilai.end(), greater<int>());
    // nilai: {95, 92, 91, 88, 85, 78, 72}

    // Cari nilai tertentu
    auto posisi = find(nilai.begin(), nilai.end(), 88);
    if (posisi != nilai.end()) {
        cout << "Nilai 88 ditemukan di indeks: "
             << distance(nilai.begin(), posisi) << endl;
        // Output: Nilai 88 ditemukan di indeks: 3
    }

    // Nilai minimum dan maksimum
    auto [min_val, max_val] = minmax_element(nilai.begin(), nilai.end());
    cout << "Min: " << *min_val << ", Max: " << *max_val << endl;
    // Output: Min: 72, Max: 95

    return 0;
}

Array vs Vector: Kapan Menggunakan Mana?

AspekArrayVector
UkuranTetap (compile time)Dinamis (runtime)
PerformaSedikit lebih cepatHampir sama
FleksibilitasRendahTinggi
KeamananTidak ada bounds check.at() ada bounds check
Kapan digunakanUkuran tetap + performa kritisKebanyakan kasus umum

Rekomendasi: Gunakan vector sebagai default. Gunakan array hanya jika ukuran benar-benar tetap dan performa sangat kritis.

Contoh Nyata: Sistem Nilai Siswa

#include <iostream>
#include <vector>
#include <algorithm>
#include <numeric>
using namespace std;

int main() {
    vector<pair<string, int>> siswa = {
        {"Ali", 85}, {"Budi", 92}, {"Candra", 78},
        {"Dewi", 95}, {"Eko", 88}
    };

    // Urutkan berdasarkan nilai (descending)
    sort(siswa.begin(), siswa.end(),
         [](const auto& a, const auto& b) { return a.second > b.second; });

    cout << "=== Peringkat Kelas ===" << endl;
    for (int i = 0; i < siswa.size(); i++) {
        cout << i + 1 << ". " << siswa[i].first
             << " — " << siswa[i].second << endl;
    }

    // Hitung rata-rata
    int total = 0;
    for (const auto& [nama, nilai] : siswa) {
        total += nilai;
    }
    double rata_rata = (double)total / siswa.size();
    cout << "Rata-rata kelas: " << rata_rata << endl;

    return 0;
}
// Output:
// === Peringkat Kelas ===
// 1. Dewi — 95
// 2. Budi — 92
// 3. Eko — 88
// 4. Ali — 85
// 5. Candra — 78
// Rata-rata kelas: 87.6

Pertanyaan yang Sering Diajukan

Apa itu undefined behavior saat mengakses array di luar batas?

Di C++, mengakses array[i] dengan i di luar batas tidak menyebabkan error langsung — program membaca/menulis memori yang tidak valid. Hasilnya tidak terduga: bisa crash, data korup, atau tampak berjalan normal tapi hasilnya salah. Ini sangat berbahaya! Gunakan .at() pada vector yang melempar exception jika indeks di luar batas.

Kapan sebaiknya menggunakan std::array<T, N> daripada C-style array?

std::array<int, 5> adalah alternatif array yang lebih aman — ia menyimpan ukurannya sendiri (.size()) dan bekerja dengan algoritma STL. Gunakan saat ukuran tetap tapi kamu ingin antarmuka yang konsisten dengan vector. Kelemahan: ukuran harus diketahui saat kompilasi.

Mengapa push_back terkadang memperlambat program?

Vector menyimpan elemen di memori berurutan. Saat kapasitas penuh dan kamu menambah elemen, vector mengalokasikan memori baru (~2x) dan menyalin semua elemen. Jika kamu tahu ukuran awal, gunakan v.reserve(n) untuk pre-alokasi dan menghindari realokasi berulang.

Apa itu pair dan kapan menggunakannya?

std::pair<T1, T2> menyimpan dua nilai dengan tipe berbeda. Diakses dengan .first dan .second. Berguna untuk pasangan key-value, koordinat, atau mengembalikan dua nilai dari fungsi. Untuk lebih dari dua nilai, gunakan std::tuple atau buat struct sendiri.

Kesimpulan

KonsepSintaksKeterangan
Array biasaint arr[5] = {...}Ukuran tetap, akses cepat
Ukuran arraysizeof(arr)/sizeof(arr[0])Hitung jumlah elemen
Vector dasarvector<int> v = {...}Ukuran dinamis
Tambah elemenv.push_back(x)Di akhir
Akses amanv.at(i)Ada bounds checking
Sortsort(v.begin(), v.end())Dari <algorithm>

Artikel sebelumnya: Fungsi di C++ — cara membuat dan menggunakan fungsi.

Langkah selanjutnya: Class dan Object di C++ — dasar pemrograman berorientasi objek di C++.

Artikel Terkait