Yaygın Koleksiyonlar
Rust’ın standart kütüphanesi, koleksiyonlar (collections) adı verilen oldukça kullanışlı pek çok veri yapısı içerir. Diğer veri türlerinin çoğu belirli tek bir değeri temsil ederken, koleksiyonlar birden fazla değeri barındırabilir. Yerleşik dizi ve demet türlerinin aksine, bu koleksiyonların işaret ettiği veriler öbekte (heap) saklanır; bu da veri miktarının derleme zamanında bilinmesi gerekmediği ve program çalışırken büyüyüp küçülebileceği anlamına gelir. Her koleksiyon türünün farklı yetenekleri ve maliyetleri vardır; mevcut durumunuza en uygun olanı seçmek zamanla geliştireceğiniz bir beceridir. Bu bölümde, Rust programlarında çok sık kullanılan üç koleksiyonu ele alacağız:
- Bir vektör (
Vec<T>), değişken sayıda değeri bellekte yan yana saklamanızı sağlar. - Bir string (
String), karakterlerden oluşan bir koleksiyondur. Daha önceStringtüründen bahsetmiştik; ancak bu bölümde onu derinlemesine inceleyeceğiz. - Bir hash map (
HashMap<K, V>), bir değeri belirli bir anahtarla ilişkilendirmenizi sağlar. Bu tür, eşlem (map) adı verilen daha genel bir veri yapısının özel bir uygulamasıdır.
Standart kütüphane tarafından sağlanan diğer koleksiyon türleri hakkında bilgi edinmek için standart kütüphane belgelendirmesine göz atabilirsiniz.
Not: Koleksiyonların asıl elemanları dinamik olarak büyüyüp küçülebilmek için
öbekte tutulurken, Vec<T> veya String değerinin işaretçi, uzunluk ve
kapasite bilgileri sabit boyutlu bir yapı oluşturur. Örneklerimizde yerel
değişken olarak gösterilen bu yapı yığında (stack) düşünülebilir; ancak
başka bir struct’ın alanı olduğunda veya Box içinde tutulduğunda kendisi de
öbekte bulunabilir. Önemli ayrım, koleksiyonun yönetim bilgileri ile
elemanları için ayrılan belleğin farklı olmasıdır. Değişken kapsam dışına
çıktığında ise öbekteki bellek, sahiplik kuralları uyarınca otomatik olarak
temizlenir. Ayrıca çok sık kullanıldıkları için Vec<T> ve String ön
tanımlı kapsamda (prelude) doğrudan hazır gelirken, HashMap ve diğer özel
amaçlı koleksiyonlar std::collections modülünden use ile kapsama dahil
edilir. İhtiyacınıza göre başvurabileceğiniz başlıca diğer standart
koleksiyonlar şunlardır:
VecDeque<T>: Yalnızca sondan değil, hem baştan hem sondan hızlı ekleme ve çıkarma gerektiren çift uçlu kuyruk (double-ended queue) senaryoları için,BTreeMap<K, V>: Anahtarların her zaman sıralı tutulması ve belirli bir aralıktaki anahtarların verimli biçimde sorgulanması gerektiğindeHashMap<K, V>yerine,HashSet<T>veBTreeSet<T>: Yinelenen elemanlara izin vermeyen benzersiz değer kümelerini sırasız (HashSet) veya sıralı (BTreeSet) olarak tutmak ve hızlı üyelik kontrolü yapmak için,BinaryHeap<T>: Elemanlar arasından her zaman en büyük (en öncelikli) değere hızlıca ulaşmak istediğiniz öncelik kuyruğu (priority queue) yapıları için tercih edilir.
Şimdi vektörlerin, string’lerin ve hash map’lerin nasıl oluşturulup güncelleneceğini ve her birini neyin özel kıldığını inceleyeceğiz.