Haftalık C++ 58 – std::vector İpuçları

Merhaba sevgili yazılımperver dostlarım, bu kısa yazımda, günlük kodlama hayatınızda (nasıl terminoloji 🙂 ) std::vector’e ilişkin dikkatinizden kaçabilecek ufak tefek ipuçlarına değineceğim. Bunları aynı zamanda bir hatırlama egzersizi olarak da görebilirsiniz.

İlk olarak std::vector yapıcısına göz atalım.

Yukarıda göreceğiniz üzere, std::vector yapıcısı, ilgili nesneyi verilen adet kadar 0 ile dolduruyor. Bu kabiliyet en çok reserve() API’si ile karıştırılabiliyor, buna dikkat.

Burada lafı geçmişken, bir diğer konuda, tek tek std::vector’e yaptığınız eklemelerde, heap’ten bellek alınmakta, eğer yoğun bir ekleme işlemi yapmayı planlıyor ve boyuta ilişkin önden bir bilginiz var ise önden reserve() API’si ile yer alıp eklemeniz hız anlamında ciddi bir fayda sağlayacaktır. Öbür türlü, ekleme işlemleri ile std::vektör konteyneri bir kaç kere yeniden boyutlandırılabilmekte. reserve() API’si ile bunun önüne geçebilirsiniz.

std::vector elemanlarına erişirken eğer [] operatörünü kullanırken sınır aşımı yaparsanız, şanlıysanız ya da dinamik kod analiz aracı kullanıyorsanız bunu fark edebilirsiniz. Öbür türlü bunu fark etmeniz zor olabilir. Bu noktada, sınır kontrolünü yapan alternatif olan at() API’si kullanılabilir (tabi minnacık bir performans kaybı olabilir).

Aslında sadece std::vector değil diğer konteynerler için de geçerli olan, iteratör ile dolaşırken ya da range-based döngüler içerisinde, vektör’e ekleme/çıkarma yapmak. Burada yine tanımlı olmayan davranışlar ile karşılaşma olasılığınız yüksek (bu arada tanımlı olmayan davranış ya da “undefined behavior” konusunu da bir yazımda işliyor olacağım). Bu durumun olma olasılığı multi-threaded uygulamalarda ve iteratörü paslandığı durumlarda iyice artar.

Bir diğer konu ise özellikle heap’ten alınan nesnelerin tutulduğu std::vector konteyner’inde bulunan nesnelerin belleğinin bırakılması (“deallocate”). Bunun sorumluluğu kullanıcıdadır, yani bir vector nesnesi içerisindeki bütün bu tarz nesneler tek tek silinmelidir. Buradaki istisna nedir peki sizce? Evet doğru tahmin, akıllı işaretçiler yanı shared_ptr ya da unique_ptr kullanımı. Bu durumda, ilave bir işlem yapmaya gerek yok. Benzer şekilde bir sınıf içerisinde, vector nesneniz var ise, sınıfın yok edilmesi ile birlikte bu nesne de siliniyor olacak, bunu bir daha tek tek ya da clear() ile boşaltmanıza gerek yok. Tabi, heap’ten alınan nesneler yok ise 😉

Evet sevgili yazılımperver dostlarım en sık kullanılan STL konteynerlerinden olan std::vector’e ilişkin bir kaç bilgi verebildiysem ne ala. Bütün tüyolar bu kadar mı, elbette değil, diğer kabiliyetlere yönelik de bir çok ince nokta olabiliyor, bunlar aslında bence en önemlilerinden. Daha detaylı ve görsel bilgi içi aşağıdaki adrese göz atabilirsiniz:

https://hackingcpp.com/cpp/std/vector.html

Son olarak std::vector’e ilişkin bir “cheatsheet” ile yazımızı sonlandıralım. Bir sonraki yazımda görüşmek dileğiyle, bol kodlu günler.

 

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Bu site, istenmeyenleri azaltmak için Akismet kullanıyor. Yorum verilerinizin nasıl işlendiği hakkında daha fazla bilgi edinin.