cpp:stl:array
−Table of Contents
std::array
Πρόκειται για μία δομή πίνακα του οποίου το μέγεθος ορίζεται κατά τη δήλωση του πίνακα και παραμένει αμετάβλητο. Μπορείτε να διατρέξετε το πίνακα χρησιμοποιώντας iterators ή με χρήση for που γνωρίζεται από τη γλώσσα C. H δομή std::array υποστηρίζει random access iterators.
Επίδοση της δομής
- Η πράξη της ένθεσης ή της διαγραφής από τον τέλος του πίνακα έχει σταθερό κόστος (O(1)).
- Η πράξη της ένθεσης ή της διαγραφής από το μέσο ή την αρχή του πίνακα συνεπάγεται την μετακίνηση όλων των στοιχείων που βρίσκονται δεξιότερα κατά μία θέση. Η επίδοση της εξαρτάται από την θέση της ένθεσης ή της διαγραφής σε σχέση με το τέλος του πίνακα. Ο επιμερισμένος χρόνος της συγκεκριμένης πράξης είναι γραμμικός στο μέγεθος των αποθηκευμένων στοιχείων του πίνακα (Ο(Ν)).
- Η πράξη της αναζήτησης είναι γραμμική στο μέγεθος των στοιχείων του πίνακα (Ο(Ν)).
- Η πρόσβαση στο i-στο στοιχείο του πίνακα έχει κόστος 1.
Ορισμός και διάτρεξη πίνακα
- array_iterator.cpp
#include <iostream> #include <array> using namespace std; int main () { std::array<int,6> 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'; }
- array_for.cpp
#include <iostream> #include <array> using namespace std; int main () { std::array<int,6> myarray = {10, 20, 30, 40, 50, 60} ; for(int i=0; i<myarray.size(); i++) std::cout << ' ' << myarray[i]; std::cout << endl; }
Πρόσβαση στα στοιχεία του πίνακα
- array_access_op.cpp
#include <iostream> #include <array> using namespace std; int main () { array<int,6> 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 υπάρχει η ισοδύναμη συνάρτηση at η οποία σε περιπτώσεις πρόσβασης εκτός ορίων πετάει exception του τύπου std::out_of_range
, το οποίο στη συνέχεια καλούμαστε να διαχειριστούμε.
- array_access_at.cpp
#include <iostream> #include <array> using namespace std; int main () { array<int,6> 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; } }
cpp/stl/array.txt · Last modified: 2021/06/06 19:56 (external edit)