0Pricing
C Academy · Pelajaran

Tipe Vektor yang Dapat Digunakan Kembali

Bungkus ukuran dan kapasitas.

Tipe Vektor yang Dapat Digunakan Kembali adalah pelajaran C Academy gratis di CoddyKit. Ini adalah pelajaran 3 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar C Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus C Academy mencakup 4 pelajaran total.

Dari Kode Terpisah Menjadi Sebuah Tipe

Mengoper penunjuk, jumlah elemen, dan kapasitas sebagai tiga variabel terpisah rentan menimbulkan kesalahan.

Mari kita gabungkan semuanya ke dalam satu struct: larik dinamis yang dapat digunakan kembali, yang sering disebut vektor. Struktur ini mengemas data dan pencatatannya bersama-sama.

Struct Vektor

Sebuah vektor memerlukan tiga bidang: penunjuk ke data, jumlah elemen yang digunakan (len), dan jumlah elemen yang dapat ditampung sebelum ukurannya diubah (cap).

typedef struct {
    int    *data;
    size_t  len;
    size_t  cap;
} Vec;

Menginisialisasi Vektor

Vektor kosong memiliki penunjuk data NULL serta panjang dan kapasitas nol. Fungsi init kecil memperjelas maksud kode.

void vec_init(Vec *v) {
    v->data = NULL;
    v->len = 0;
    v->cap = 0;
}

Operasi Push

vec_push menambahkan satu elemen ke bagian akhir. Jika vektor sudah penuh, kapasitasnya digandakan terlebih dahulu.

Fungsi ini mengembalikan 0 jika berhasil dan -1 jika alokasi gagal, sehingga pemanggil dapat menanganinya.

int vec_push(Vec *v, int value) {
    if (v->len == v->cap) {
        size_t nc = v->cap ? v->cap * 2 : 4;
        int *tmp = realloc(v->data, nc * sizeof(*v->data));
        if (!tmp) return -1;
        v->data = tmp;
        v->cap = nc;
    }
    v->data[v->len++] = value;
    return 0;
}

Membaca Kembali Elemen

Karena len mencatat jumlah elemen yang digunakan, lakukan iterasi dari 0 hingga len - 1. Kapasitasnya mungkin lebih besar, tetapi slot-slot tersebut belum menjadi bagian dari data Anda.

for (size_t i = 0; i < v->len; i++)
    printf("%d\n", v->data[i]);

Membebaskan Vektor

Vektor memiliki buffer heap-nya sendiri, sehingga memerlukan fungsi pembersihan yang sesuai. Setelah dibebaskan, atur ulang bidang-bidangnya agar struct tersebut tidak dapat digunakan secara keliru.

void vec_free(Vec *v) {
    free(v->data);
    v->data = NULL;
    v->len = v->cap = 0;
}

Menyatukan Semuanya

Program lengkap ini membuat sebuah vektor, menambahkan lima nilai, mencetaknya, lalu membebaskannya dengan benar.

#include <stdio.h>
#include <stdlib.h>

typedef struct { int *data; size_t len, cap; } Vec;

int vec_push(Vec *v, int value) {
    if (v->len == v->cap) {
        size_t nc = v->cap ? v->cap * 2 : 4;
        int *tmp = realloc(v->data, nc * sizeof(*v->data));
        if (!tmp) return -1;
        v->data = tmp; v->cap = nc;
    }
    v->data[v->len++] = value;
    return 0;
}

int main(void) {
    Vec v = {0};
    for (int i = 0; i < 5; i++) vec_push(&v, i * 10);
    for (size_t i = 0; i < v.len; i++) printf("%d\n", v.data[i]);
    free(v.data);
    return 0;
}

Inisialisasi Nol dengan {0}

Menulis Vec v = {0}; menetapkan nol ke setiap bidang, termasuk penunjuk data menjadi NULL.

Ini adalah cara pintas yang praktis agar vektor siap digunakan oleh vec_push tanpa memanggil fungsi init secara eksplisit.

Vec v = {0};      /* data=NULL, len=0, cap=0 */
vec_push(&v, 42);

Pembantu get yang Aman

Mengindeks melewati len adalah kesalahan. Pengakses kecil dapat memeriksa batas dan menandai kesalahan, dengan mengorbankan sedikit kecepatan demi keamanan.

int vec_get(const Vec *v, size_t i, int *out) {
    if (i >= v->len) return -1;   /* out of range */
    *out = v->data[i];
    return 0;
}

Mengapa len dan cap Dilacak Terpisah

cap menunjukkan jumlah memori yang dialokasikan; len menunjukkan jumlah yang benar-benar digunakan.

Menyediakan kapasitas cadangan berarti sebagian besar operasi push tidak perlu memanggil realloc. Pemisahan inilah yang membuat vektor cepat sekaligus fleksibel.

Menggeneralisasi Tipe

Vektor ini menyimpan int. Untuk menampung tipe lain, Anda dapat mengubah tipe elemennya, atau menyimpan void * bersama ukuran elemen.

Polanya—init, push, free—tetap sama, apa pun yang Anda simpan.

typedef struct {
    double *data;
    size_t  len, cap;
} DVec;   /* same shape, different element type */

Pemeriksaan Singkat

Uji pemahaman Anda tentang tipe vektor.

Ringkasan

Vektor menggabungkan penunjuk data, len, dan cap ke dalam satu struct.

vec_push menggandakan kapasitas saat penuh, vec_free melepaskan buffer dan mengatur ulang bidang-bidangnya, sedangkan {0} melakukan inisialisasi dengan bersih. Pola yang dapat digunakan kembali ini lebih baik daripada mengelola variabel-variabel terpisah. Berikutnya: membebaskan memori dengan benar dan menghindari kebocoran.

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Tipe Vektor yang Dapat Digunakan Kembali” gratis?

Ya — teks lengkap “Tipe Vektor yang Dapat Digunakan Kembali” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus C Academy, upgrade ke CoddyKit PRO. Kursus C Academy mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “Tipe Vektor yang Dapat Digunakan Kembali”?

Bungkus ukuran dan kapasitas. Kamu berlatih C Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai C Academy?

Tidak diperlukan pengalaman sebelumnya. C Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 3 dari 4.

Berapa lama pelajaran “Tipe Vektor yang Dapat Digunakan Kembali” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran C Academy ini?

Ya. Setiap pelajaran C Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. Mengalokasikan Larik
  2. Memperbesar dengan realloc
  3. Tipe Vektor yang Dapat Digunakan Kembali
  4. Membebaskan Memori dan Menghindari Kebocoran
← Kembali ke C Academy