Haftalık C++ 31 – std::array

Evet dostlar, C++ kabiliyetlerinden kalan bir iki tanesine bakmaya devam ediyoruz. Bu yazımda, hızlıca ve kısaca bu kabiliyete bakıp, kalan diğer C++ 11 kabiliyetlerine bakmaya devam edeceğiz. Bildiğiniz üzere bir kaç hafta önce C++ 20 standardı da kabul edildi. Yani daha, öğrenecek çok konu var.

std::array

std::array‘i kısaca, C dizilerini herhangi bir ekstra masraf getirmeden C++ konteynerleri gibi kullanmanıza olanak sağlayan sınıftır. Bir diğer ifade ile bu sınıfı kullanmanız ile geleneksel dizileri kullanmanız arasında performans anlamında hiç bir fark bulunmamaktadır. Aslına bakarsanız, gerçekleme anlamında da aşağıdakine çok benzer bir şekilde “wrap” edilerek tanımlanabilir:

std::array‘i kullanabilmek için <array> başlık dosyasını eklemeniz yeterli. std::array ile deklerasyon yaparken, ilgili dizinin içeriğinin tipini ve boyutunu vermelisiniz. Bu boyut daha sonra değiştirilememekte.

Kullanımı normal dizilere benzese de, aşağıdaki güzellikleri de kullanmanıza olanak sağlar 😉

En önemli özelliklerden birisi, fonksiyonlara parametre olarak, kopyalanarak geçirilebilir ve dönülebilir. Normal dizilerde varsayılan olarak işaretçi olarak geçirilerek, dönülmekteydi. Yani fonksiyon içerisinde yapılan değişikliklerden diziler etkilenmektedir. Hemen bir örnek ile bakalım:

Sunulan API’ler, STL tarafından sunulan diğer API’ler ile daha uyumlu ve konteynerlere benzemektedir. (Burada, şunu da eklemekte fayda var, artık geleneksel diziler de bir takım STL kabiliyetleri ile kullanılabilmektedir). Bu bağlamda array’ler ile iterator kullanılabilmektedir:

 

Çok boyutlu dizileri, aşağıdaki örnektekine benzer şekilde oluşturabilirsiniz:

Yukarıdaki tanımlama uzun derseniz, yine daha önce işlediğimiz “using” ile “type alias” yaparak daha kısaltıp genelleştirebiliriz:

Geleneksel dizilerdeki gibi [] operatörü kullanılabileceği gibi, at(), front(), back() gibi API’ler de sunulmaktadır. Boyut bilgisini, size() fonksiyonu ile sorgulayabilirsiniz. Benzer şekilde, ilgili dizinin boş olup/olmadığı da empty() API’si de kullanılabilir. Yukarıdaki örneklerde kullanılan initializer_list desteği.

İşaretçilere otomatik ya da “implicit” olarak dönüştürülmemekte. Bunu aslında bir önlem olarak da düşünmekte fayda var. Normal diziler, yukarıda da bahsedildiği üzere, işaretçi olarak geçirilmektedir. Peki, std::array içeriğine bu şekilde ulaşmak istediğiniz durumda ne kullanacaksınız. Bu amaçla data() API’si sunulmakta, bu sayede işaretçiler kullanılarak içeriğe ulaşılabilir ve güncellenebilir. Yine yukarıdaki örneklere benzer bir örnek ile bu API’ye göz atalım:

Bu noktada aklınıza geleneksel diziler, std::array ve std::vector’leri hangi durumlarda kullanmalıyım diye bir sour gelebilir. Öncelikli olarak, eğer derleme zamanında, kullanacağınız dizinin boyutu belli ise ve boyutunun değişmesi öngörülmüyorsa, std::array doğru bir seçim olacaktır. Aksi durumda, yine ihtiyaç duyulan isterlere göre std::vector daha uygun olabilir. Mümkün olduğunca geleneksel diziler yerine std::array tercih edilebilir.

Evet yazılımperver dostlar, uzun bir aradan sonra bir C++ yazımızı daha tamamladık, bir sonraki yazıma kadar kendinize çok iyi davranın ve sağlıkla kalın.

Kaynaklar:

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.