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?
| Aspek | Array | Vector |
|---|---|---|
| Ukuran | Tetap (compile time) | Dinamis (runtime) |
| Performa | Sedikit lebih cepat | Hampir sama |
| Fleksibilitas | Rendah | Tinggi |
| Keamanan | Tidak ada bounds check | .at() ada bounds check |
| Kapan digunakan | Ukuran tetap + performa kritis | Kebanyakan 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
| Konsep | Sintaks | Keterangan |
|---|---|---|
| Array biasa | int arr[5] = {...} | Ukuran tetap, akses cepat |
| Ukuran array | sizeof(arr)/sizeof(arr[0]) | Hitung jumlah elemen |
| Vector dasar | vector<int> v = {...} | Ukuran dinamis |
| Tambah elemen | v.push_back(x) | Di akhir |
| Akses aman | v.at(i) | Ada bounds checking |
| Sort | sort(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++.