Programlama dillerinde diziler uygulanırken syntax olarak genelde C stili dizilerden ilham aldılar. Özellik olarak C stili dizilerin üzerine ihtiyaca göre üye fonksiyonlar da eklendi.
C++11 ile gelen std::array ile C stili dizilerden çok daha fazla kullanışlılığa ve okunabilirliğe sahip kod yazılırken performans anlamında ise neredeyse aynı seviyede sayılır.
std::array C stili diziler gibi statik boyutludur ve bellekte derleme zamanında yer ayrılır.
std::array’ e genel bakış
std::array arka planda C stili dizinin ve ilgili üye fonksiyonlarının bulunduğu array sınıf şablonu yapısındadır.
1 | template<typename T, size_t N> |
std::array kullanmak için #include <array> ile array kütüphanesi projeye eklenir. std::array uzunluğu derleme zamanında hesaplandığından ve o bilgi oluşturulan nesne içerisindeki bir değişkende saklandığından sonradan o std::array nesnesinin uzunluğunu öğrenmek kolay ve hızlıdır.
std::array oluşturmak
std::array iki bileşenden oluşur: İlki array içinde saklanacak elemanların tipi ve ikincisi array nesnesinin ne kadar eleman tutacağı (yani uzunluğu).
1 | //a1 dizisi 10 int tipinde eleman tutar |
Ayrıca mevcut diziler yeni dizilere atama yoluyla kopyalanabilir.
1 | //atama yoluyla yeni kopya dizi oluşturma |
Aynı uzunluktaki başka bir dolu diziye = operatörü ile atama yapılabilir ama uzunluklar aynı olmadığında hata alınacaktır.
1 | //a3 dizisi değerlerini a2 dizisine atama |
std::array içindeki verilere erişmek
std::array içindeki verilere dizilerden alıştığımız şekilde [] operatörü ile de erişebiliriz ama sınır kontrolü yapmadığından dizi boyutundan farklı değerlerde hata alınacaktır.
1 | //beklenilen şekilde değer atamaları gerçekleşir |
Sınır kontrolü için at() üye fonksiyonu kullanılabilir.
1 | std::cout << "a2.at(4): " << a2.at(4) << std::endl; |
Ayrıca front() ve back() üye fonksiyonlarıyla array nesnesindeki ilk ve son değerlere erişebiliriz.
data() üye fonksiyonu
std::array dolaylı yoldan raw pointera dönüşmez. Pointer temelli kullanmak isteniyorsa data() üye fonksiyonu kullanmak gerekir.
Örneğin buffer arayüzü için C stili API yazalım:
1 | void carr_func(int * arr, size_t size) |
carr_func fonksiyonunda ilk parametreye std::array gönderirsek derleyici hatası oluşur.
1 | ../../array.cpp:44:2: error: no matching function for call to 'carr_func' |
Bunun yerine data() üye fonksiyonunu kullanınca sorun çözülür.
1 | //Error: |
size() ve empty() üye fonksiyonları
size() üye fonksiyonuyla dizinin uzunluğu öğrenilebilir. empty() üye fonksiyonu ise dizinin içeriği boş ise true, dolu ise false döndürür.
1 | a2.size(); //5 |
Container(kap) işlemleri
std::array container sınıfı olduğundan temel container arayüzlerini sunmaktadır. std::array statik uzunlukta olduğundan dinamik olarak uzunluk değiştirme gibi işlemler mevcut değildir. Ancak std::sort gibi sıralama fonksiyonları kullanılabilir.
1 | std::sort(a1.begin(), a1.end()); |
Comments