Yeniden Kullanılabilir Vektör Türü
Boyutu ve kapasiteyi sarın.
Yeniden Kullanılabilir Vektör Türü, CoddyKit'te ücretsiz bir C Academy dersidir. Bu, 4 dersinin 3. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, C Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. C Academy kursu toplamda 4 dersten oluşur.
Bağımsız Koddan Bir Türe
Bir göstericiyi, sayıyı ve kapasiteyi üç ayrı değişken olarak geçirmek hataya açıktır.
Bunları tek bir struct içinde birleştirelim: yeniden kullanılabilir bir dinamik dizi, genellikle vektör olarak adlandırılır. Verileri ve bunlarla ilgili yönetim bilgilerini birlikte paketler.
Vektör Yapısı
Bir vektörün üç alana ihtiyacı vardır: verilere gösterici, kullanılan öğe sayısı (len) ve yeniden boyutlandırılmadan önce sığabilecek öğe sayısı (cap).
typedef struct {
int *data;
size_t len;
size_t cap;
} Vec;Vektörü Başlatma
Boş bir vektörün NULL veri göstericisi ile sıfır uzunluğu ve kapasitesi vardır. Küçük bir başlatma işlevi amacı açıkça ortaya koyar.
void vec_init(Vec *v) {
v->data = NULL;
v->len = 0;
v->cap = 0;
}Push İşlemi
vec_push sona bir öğe ekler. Vektör doluysa önce kapasiteyi iki katına çıkarır.
Başarı durumunda 0, bellek ayırma başarısız olursa -1 döndürür; böylece çağıran kod uygun tepkiyi verebilir.
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;
}Öğeleri Geri Okuma
len kullanılan sayıyı izlediği için 0 ile len - 1 arasında dolaşırsınız. Kapasite daha büyük olabilir, ancak bu yuvalar henüz verilerinizin parçası değildir.
for (size_t i = 0; i < v->len; i++)
printf("%d\n", v->data[i]);Vektörü Serbest Bırakma
Bir vektör kendi yığın arabelleğinin sahibidir; bu nedenle buna karşılık gelen bir temizleme işlevine ihtiyaç duyar. Serbest bıraktıktan sonra alanları sıfırlayın; böylece yapı yanlış kullanılamaz.
void vec_free(Vec *v) {
free(v->data);
v->data = NULL;
v->len = v->cap = 0;
}Hepsini Birleştirme
Bu tam program bir vektör oluşturur, beş değer ekler, bunları yazdırır ve ardından vektörü düzgün biçimde serbest bırakır.
#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;
}{0} ile Sıfırlarla Başlatma
Vec v = {0}; yazmak, veri göstericisi NULL dahil olmak üzere her alanı sıfıra ayarlar.
Bu kullanışlı kısayol, açık bir başlatma işlevi çağırmadan vektörü vec_push için hazırlar.
Vec v = {0}; /* data=NULL, len=0, cap=0 */
vec_push(&v, 42);Güvenli bir get Yardımcısı
len sınırının ötesine erişmek bir hatadır. Küçük bir erişim işlevi sınırları denetleyip hataları bildirebilir; bunun karşılığında biraz hızdan ödün verilir.
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;
}len ve cap Neden Ayrı İzlenir
cap ayrılmış bellek miktarıdır; len ise gerçekte kullandığınız miktardır.
Yedek kapasite bulundurmak, çoğu ekleme işleminde realloc çağrılmamasını sağlar. Vektörü hem hızlı hem de esnek yapan ayrım budur.
Türü Genelleştirme
Bu vektör int değerleri saklar. Başka türleri tutmak için öğe türünü değiştirebilir veya öğe boyutuyla birlikte void * saklayabilirsiniz.
Ne sakladığınızdan bağımsız olarak düzen, başlatma, ekleme ve serbest bırakma aynı kalır.
typedef struct {
double *data;
size_t len, cap;
} DVec; /* same shape, different element type */Hızlı Kontrol
Vektör türü konusundaki anlayışınızı sınayın.
Özet
Bir vektör, veri göstericisini, len ve cap alanlarını tek bir struct içinde birleştirir.
vec_push vektör dolduğunda kapasiteyi iki katına çıkarır, vec_free arabelleği serbest bırakıp alanları sıfırlar ve {0} temiz bir başlatma sağlar. Bu yeniden kullanılabilir düzen, bağımsız değişkenleri ayrı ayrı yönetmekten daha iyidir. Sırada: doğru biçimde serbest bırakma ve sızıntılardan kaçınma.
Sıkça Sorulan Sorular
“Yeniden Kullanılabilir Vektör Türü” dersi ücretsiz mi?
Evet — “Yeniden Kullanılabilir Vektör Türü” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve C Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. C Academy kursu toplamda 4 dersten oluşur.
“Yeniden Kullanılabilir Vektör Türü” dersinde ne öğreneceğim?
Boyutu ve kapasiteyi sarın. C Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
C Academy öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te C Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 3. dersidir.
“Yeniden Kullanılabilir Vektör Türü” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu C Academy dersinde kod yazıp çalıştırabilir miyim?
Evet. Her C Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- Dizi Ayırma
- realloc ile Büyütme
- Yeniden Kullanılabilir Vektör Türü
- Belleği Serbest Bırakma ve Sızıntıları Önleme