====== std::array ======
Πρόκειται για μία δομή πίνακα του οποίου το μέγεθος ορίζεται κατά τη δήλωση του πίνακα και παραμένει αμετάβλητο. Μπορείτε να διατρέξετε το πίνακα χρησιμοποιώντας //iterators// ή με χρήση for που γνωρίζεται από τη γλώσσα C. H δομή //std::array// υποστηρίζει random access iterators.
===== Επίδοση της δομής =====
* Η πράξη της ένθεσης ή της διαγραφής από τον τέλος του πίνακα έχει σταθερό κόστος **(O(1))**.
* Η πράξη της ένθεσης ή της διαγραφής από το μέσο ή την αρχή του πίνακα συνεπάγεται την μετακίνηση όλων των στοιχείων που βρίσκονται δεξιότερα κατά μία θέση. Η επίδοση της εξαρτάται από την θέση της ένθεσης ή της διαγραφής σε σχέση με το τέλος του πίνακα. Ο επιμερισμένος χρόνος της συγκεκριμένης πράξης είναι γραμμικός στο μέγεθος των αποθηκευμένων στοιχείων του πίνακα **(Ο(Ν))**.
* Η πράξη της αναζήτησης είναι γραμμική στο μέγεθος των στοιχείων του πίνακα **(Ο(Ν))**.
* Η πρόσβαση στο i-στο στοιχείο του πίνακα έχει κόστος 1.
===== Ορισμός και διάτρεξη πίνακα =====
#include
#include
using namespace std;
int main () {
std::array myarray = {10, 20, 30, 40, 50, 60} ;
std::cout << "myarray fw:";
for (auto it=myarray.cbegin() ; it < myarray.cend(); ++it )
std::cout << ' ' << *it; // cannot modify *it
std::cout << '\n';
cout << "myarray bw:";
for (auto rit=myarray.crbegin() ; rit < myarray.crend(); ++rit )
std::cout << ' ' << *rit; // cannot modify *rit
std::cout << '\n';
std::cout << "myarray +10 fw:";
for (auto it=myarray.cbegin() ; it < myarray.cend(); ++it ) {
*it += 10;
std::cout << ' ' << *it; // cannot modify *it
}
std::cout << '\n';
cout << "myarray +100 bw:";
for (auto rit=myarray.rbegin() ; rit < myarray.rend(); ++rit ){
*it += 100;
std::cout << ' ' << *rit; // cannot modify *rit
}
std::cout << '\n';
}
#include
#include
using namespace std;
int main () {
std::array myarray = {10, 20, 30, 40, 50, 60} ;
for(int i=0; i
===== Πρόσβαση στα στοιχεία του πίνακα =====
#include
#include
using namespace std;
int main () {
array myarray = {10, 20, 30, 40, 50, 60};
myarray[5] = 600;
cout << "myarray[5]:" << myarray[5] << endl;
myarray[6] = 1;
cout << "myarray[6]:" << myarray[6] << endl;
}
Παρατηρούμε ότι στον παραπάνω κώδικα η πρόσβαση εκτός ορίων παράγει τερματισμό του προγράμματος μέσω segmentation fault. Εάν θέλουμε να μπορούμε να ελέγχουμε τις πιθανές λανθασμένες προσπελάσεις μέσω της διαχείρισης ενός exception υπάρχει η ισοδύναμη συνάρτηση [[http://www.cplusplus.com/reference/array/array/at/|at]] η οποία σε περιπτώσεις πρόσβασης εκτός ορίων πετάει exception του τύπου ''std::out_of_range'', το οποίο στη συνέχεια καλούμαστε να διαχειριστούμε.
#include
#include
using namespace std;
int main () {
array myarray = {10, 20, 30, 40, 50, 60};
myarray[5] = 600;
cout << "myarray[5]:" << myarray[5] << endl;
try {
myarray.at(10) = 1;
cout << "myarray[10]:" << myarray[10] << endl;
} catch(std::out_of_range& ex) {
cout << ex.what() << endl;
}
}