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