Aşağıda ismi Vector olan bir sınıfın tanımlandığı başlık dosyası yer almaktadır. Bu ödevde Vector sınıfının kodlarını yazmanız isteniyor.
- Vector sınıfı türünden bir nesne bir dinamik diziyi (dynamic array) temsil etmektedir. Bu ödevi yapabilmek için dinamik dizi veri yapısı hakkında temel bilgilere sahip olmalısınız.
- Kodlaması yapılaacak Vector sınıfı int türden değerler tutacaktır. Kursumuzun türden bağımsız programlama (templates) kısmına geldiğimizde sınıfı türden bağımsız hale getireceğiz.
1. İçsel (nested) iterator türü. Kaptaki öğelerin konumlarını tutan iterator nesnelerinin türü. Okuma ve yazma erişimi sağlar.
2. İçsel (nested) const_iterator türü. Kaptaki öğelerin konumlarını tutan const_iterator nesnelerinin türü. Yalnızca okuma amaçlı erişim sağlar.
3. Varsayılan kurucu işlev (default constructor). Boş bir Vector nesnesi oluşturmalı.
4. Sonlandırıcı işlev (destructor). Kaynakları geri vermeli.
5. Kopyalayan kurucu işlev. (copy constructor)
6. Taşıyan kurucu işlev. (move constructor)
7. Kopyalayan atama işlevi. (copy assignment)
8. Taşıyan atama işlevi. (move assignment)
9. Kurucu işlev. Vector'ü değeri val olan size tane öğe ile başlatmalı (fill constructor).
10. std::initializer_list parametreli kurucu işlev. Vector nesnesini listedeki değerleri tutacak şekilde başlatır.
11. Aralık (range) parametreli kurucu işlev. Vector nesnesini [pbegin, pend) aralığındaki değerlerle başlatır. Aralık olarak doğrudan adresler (pointer) kullanılmaktadır.
12. Aralık (range) parametreli kurucu işlev. Vector nesnesini [beg, end) aralığındaki değerlerle başlatır. Aralık olarak const_iterator değerleri kullanılmaktadır.
13. reserve işlevi. Eğer new_cap değeri var olan kapasiteden büyükse kapasiteyi arttırmalı. Eğer new_cap değeri var olan kapasiteden küçükse kapasiteyi küçültmemeli.
14. Kapasite değerini Vector'de tutulan öğe sayısına (size) büzmeli (kapasiteyi küçültmeli).
15. Vector'de tutulan ilk öğenin konumunu döndürmeli.
İşlevin geri dönüş değeri içsel bir tür olan iterator türüdür.
Boş bir Vector'de bu konumun içerik (dereferencing) operatörünün terimi yapılması tanımsız davranıştır.
16. Vector'de tutulan son öğeden sonraki (olmayan öğenin) konumunu döndürmeli.
İşlevin geri dönüş değeri içsel bir tür olan iterator türüdür.
Bu işlevden alınan konum karşılaştırma operatörleri ile diğer konumlarla karşılaştırılabilir.
Bu konumun içerik (dereferencing) operatörünün terimi yapılması tanımsız davranıştır.
17. Vector'de tutulan ilk öğenin konumunu (salt okuma erişimli) döndürmeli.
İşlevin geri dönüş değeri içsel bir tür olan const_iterator türüdür.
Boş bir Vector'de bu konumun içerik (dereferencing) operatörünün terimi yapılması tanımsız davranıştır.
16. Vector'de tutulan son öğeden sonraki (olmayan öğenin) konumunu döndürmeli.
İşlevin geri dönüş değeri içsel bir tür olan const_iterator türüdür. Bu işlevden alınan konum karşılaştırma operatörleri ile diğer konumlarla karşılaştırılabilir. Bu konumun içerik (dereferencing) operatörünün terimi yapılması tanımsız davranıştır.
22. initializer_list parametreli atama işlevi.
Bu işlevin çağrılması ile Vector artık parametre olan listedeki değerleri tutmalı.
23. resize işlevi.
Vector'de tutulan öğe sayısını değiştirmeli.
Bu işlev Vector'deki öğe sayısını hem arttırmak hem de azaltmak için kullanılabilir.
İşlevin varsayılan argüman alan ikinci parametresi Vector'deki öğe sayısının arttırılması durumunda yeni eklenecek öğelerin alacakları değerdir.
Vector'deki öğe sayısından daha küçük bir değerle çağrılırsa sondan silme işlemi yapmalı.
26. assign işlevi.
Bu işlevin çağrılmasıyla Vector nesnesi n tane val değeri tutar hale gelmeli. (fill assign)
27. initializer_list parametreli assign işlevi.
Bu işlevin çağrılması ile Vector artık parametresine gelen listedeki değerleri tutmalı.
28. aralık (range)_ parametreli assign işlevi.
Bu işlevin çağrılması ile Vector artık parametresine gelen aralıktaki değerleri tutmalı.
30. where konumuna val değerini eklemeli.
İşlevin geri dönüş değeri eklenmiş öğenin konumu olmalı.
31. where konumuna [beg end) aralığındaki değerleri eklemeli.
İşlevin geri dönüş değeri ilk eklenmiş öğenin konumu olmalı.
34. where konumundaki öğeyi silmeli.
İşlevin geri dönüş değeri silinmiş öğeden sonraki öğenin konumu olmalı
35. [beg end) aralığındaki değerleri silmeli.
İşlevin geri dönüş değeri silinen öğelerden sonraki öğenin konumu olmalı.
36. push_back işlevi.
Parametresine gelen değeri Vector'e son öğe olarak eklemeli.
37. pop_back işlevi.
Vector'deki son öğeyi silmeli.
38. swap işlevi iki Vector'ü takas etmeli.
İşlev yalnızca sınıfın veri öğelerini takas etmeli.
Dinamik bellek alanında yer alan Vector'ün tuttuğu öğeler takas edilmemelidir.
39. clear işlevi iki Vector'deki tüm öğeleri silmeli yani Vector'ü boşaltmalı.
Bu işlemden sonra Vector'ün size değeri 0 olmalı.
42. front işlevi Vector'de tutulan ilk öğeyi döndürmeli.
Vector'ün boş olması durumunda bu işlevin çağrılması tanımsız davranıştır.
43. front işlevi Vector'de tutulan ilk öğeye const referans döndürmeli (const overloading).
Vector'ün boş olması durumunda bu işlevin çağrılması tanımsız davranıştır.
44. back işlevi Vector'de tutulan son öğeyi döndürmeli.
Vector'ün boş olması durumunda bu işlevin çağrılması tanımsız davranıştır.
45. back işlevi Vector'de tutulan ilk öğeye const referans döndürmeli (const overloading).
Vector'ün boş olması durumunda bu işlevin çağrılması tanımsız davranıştır.
46. operator[] işlevi. Vector'de tutulan idx indisli öğeyi döndürmeli. idx değerinin geçerli olmaması tanımsız davranıştır.
47. operator[] işlevi. Vector'de tutulan idx indisli öğeyi (salt okuma erişimli) döndürmeli. (const overloading) idx değerinin geçerli olmaması tanımsız davranıştır.
50. data işlevi Vector'de tutulan ilk öğenin adresini döndürmeli.
Bu adres C işlevlerine bir dizi adresi olarak gönderilebilir.
51. data işlevi Vector'de tutulan ilk öğenin adresini (salt okuma erişimli) döndürmeli.
Bu adres C api'lerine bir dizi adresi olarak gönderilebilir.
52. capacity işlevi Vector'ün kapasite değerini döndürmeli.
Kapasite değeri Vector nesnesinin edindiği ve tutmakta olduğu dinamik bellek bloğunun öğe sayısı cinsinden büyüklüğüdür.
53. size işlevi Vector'ün size değerini döndürmeli.
size değeri Vector nesnesinin tutmakta olduğu öğe sayısıdır.
54. empty işlevi Vector'ün boş olup olmadığını sınamalı.
60. Ön ek ++ operatörü. iterator nesnesini 1 arttırarak bir sonraki öğenin konumunu tutmasını sağlamalı.
61. Son ek ++ operatörü. iterator nesnesini 1 arttırarak bir sonraki öğenin konumunu tutmasını sağlamalı.
62. Ön ek -- operatörü. iterator nesnesini 1 eksilterek bir önceki öğenin konumunu tutmasını sağlamalı.
63. Son ek -- operatörü. iterator nesnesini 1 eksilterek bir önceki öğenin konumunu tutmasını sağlamalı.
64. İçerik operatörü.
iterator nesnesinin tuttuğu konumdaki öğeye eriştirmeli.
65. İndeks operatörü.
iterator nesnesinin tuttuğu konumdaki öğeden n sonraki ya da önceki öğeye eriştirmeli.
66. İki iterator arasındaki farkı döndürmeli.
67. iterator konumundan n sonraki konumu döndürmeli.
68. iterator konumundan n sonraki konumu döndürmeli.
69. iterator nesnesini n sonraki nesnenin konumunu tutacak şekilde arttırmalı.
70. iterator nesnesini n önceki nesnenin konumunu tutacak şekilde eksiltmeli.
71. iterator nesnelerinin karşılaştırılmalarını sağlayan karşılaştıma operatör işlevleri.
80. Ön ek ++ operatörü.
const_iterator nesnesini 1 arttırarak bir sonraki öğenin konumunu tutmasını sağlamalı.
81. Son ek ++ operatörü.
const_iterator nesnesini 1 arttırarak bir sonraki öğenin konumunu tutmasını sağlamalı.
82. Ön ek -- operatörü.
const_iterator nesnesini 1 eksilterek bir önceki öğenin konumunu tutmasını sağlamalı.
83. Son ek -- operatörü.
const_iterator nesnesini 1 eksilterek bir önceki öğenin konumunu tutmasını sağlamalı.
84. İçerik operatörü.
const_iterator nesnesinin tuttuğu konumdaki öğeye okuma amaçlı erişim sağlamalı.
85. İndeks operatörü.
const_iterator nesnesinin tuttuğu konumdaki öğeden n sonraki ya da önceki öğeye okuma amaçlı erişim sağlamalı.
86. İki const_iterator arasındaki farkı döndürmeli.
87. const_iterator konumundan n sonraki konumu döndürmeli.
88. const_iterator konumundan n sonraki konumu döndürmeli.
89. const_iterator nesnesini n sonraki nesnenin konumunu tutacak şekilde arttırmalı.
80. const_iterator nesnesini n önceki nesnenin konumunu tutacak şekilde eksiltmeli.
81. const_iterator nesnelerinin karşılaştırılmalarını sağlayan karşılaştıma operatör işlevleri.
- Dilediğiniz global işlevleri "friend" yapabilirsiniz.
- Sınıfın private arayüzünü dilediğiniz gibi oluşturabilirsiniz.
- Gerekli görürseniz sınıfın public arayüzüne eklemeler yapabilirsiniz.
- Gerekli görürseniz sınıfın public arayüzünde değişiklikler yapabilirsiniz.
- Sınıfın public öğelerinin isimlerini istediğiniz şekilde değiştirebilirsiniz. Ödevde seçilen isimler C++ standart kütüphanesinin tercih ettiği isimlerdir.
- Dilediğiniz işlevleri "constexpr" yapabilirsiniz.
- Bu ödevde exception handling araçlarını kullanabilirsiniz.
- Kod tekrarından mümkün olduğu kadar kaçınmalısınız.
- const doğruluğuna (const correctness) çok dikkat etmelisiniz. (const olması gereken tüm varlıklar const olmalı)
- Gereksiz yorum satırlarından mümkün olduğu kadar kaçınmalısınız.
- Yazdığınız kodların doğru çalışıp çalışmadığını sınamak için test kodları yazmalısınız.
- Derleyicinizin uygun bir switch'ini kullanarak mantıksal uyarı iletilerinin hata (error) olarak değerlendirilmesini sağlayınız.
class Vector {
public:
//--------------------------------------------------
// type members
class iterator; //1
class const_iterator; //2
//--------------------------------------------------
//--------------------------------------------------
// special member functions
Vector(); //3
~Vector(); //4
Vector(const Vector &); //5
Vector(Vector &&); //6
Vector& operator=(const Vector&); //7
Vector& operator=(Vector&&); //8
//--------------------------------------------------
//--------------------------------------------------
//constructors
explicit Vector(size_t size, int val = 0); //9
Vector(std::initializer_list<int> ilist); //10
Vector(const int *pbegin, const int *pend); //11
Vector(const_iterator beg, const_iterator end); //12
//--------------------------------------------------
void reserve(size_t new_cap); //13
void shrink_to_fit(); //14
iterator begin(); //15
iterator end(); //16
const_iterator begin()const; //17
const_iterator end()const; //18
//setters/mutators
Vector& operator=(std::initializer_list<int> ilist); //22
void resize(std::size_t, int val = 0); //23
void assign(std::size_t n, int val); //26
void assign(std::initializer_list<int> ilist); //27
void assign(const int* pbeg, const int* pend); //28
iterator insert(iterator where, int val); //30
iterator insert(iterator where, iterator source_beg, iterator source_end); //31
iterator erase(iterator where); //34
iterator erase(iterator beg, iterator end); //35
void push_back(int val); //36
void pop_pack(); //37
void swap(Vector &other); //38
void clear(); //39
int &front(); //42
const int &front()const; //43
int &back(); //44
const int &back()const; //45
int& operator[](size_t idx); //46
const int& operator[](size_t idx)const; //47
//--------------------------------------------------
int* data(); //50
const int* data()const; //51
size_t capacity()const; //52
size_t size()const; //53
bool empty()const; //54
//--------------------------------------------------
//type members
class iterator {
//...
public:
iterator& operator++(); //60
iterator operator++(int); //61
iterator& operator--(); //62
iterator operator--(int); //63
int& operator*(); //64
int &operator[](int n); //65
std::ptrdiff_t operator-(iterator); //66
iterator operator+(int n); //67
iterator operator-(int n); //68
iterator& operator+=(int n) //69
iterator& operator-=(int n) //70
bool operator<(iterator)const; //71
bool operator<=(iterator)const; //71
bool operator>(iterator)const; //71
bool operator>=(iterator)const; //71
bool operator==(iterator)const; //71
bool operator!=(iterator)const; //71
};
class const_iterator {
//...
public:
public:
const_iterator& operator++(); //80
const_iterator operator++(int); //81
const_iterator& operator--(); //82
const_iterator operator--(int); //83
int& operator*(); //84
int &operator[](int n); //85
ptrdiff_t operator-(iterator); //86
const_iterator operator+(int n); //87
const_iterator operator-(int n); //88
const_iterator& operator+=(int n) //89
const_iterator& operator-=(int n) //90
bool operator<(const_iterator)const; //91
bool operator<=(const_iterator)const; //91
bool operator>(const_iterator)const; //91
bool operator>=(const_iterator)const; //91
bool operator==(const_iterator)const; //91
bool operator!=(const_iterator)const; //91
};
};
};
};