User Tools

Site Tools


cpp:stl:array

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Next revision
Previous revision
cpp:stl:array [2020/05/27 14:44] – created gthanoscpp:stl:array [Unknown date] (current) – external edit (Unknown date) 127.0.0.1
Line 1: Line 1:
 ====== std::array ====== ====== std::array ======
  
-Πρόκειται για μία δομή πίνακα συγκεκριμένου μεγέθους. Όταν ορίζετε τον πίνακα τύπο δεδομένων που θα αποθηκεύσει ο πίνακας καλείστε να ορίσετε και το μέγεθος του.+Πρόκειται για μία δομή πίνακα του οποίου το μέγεθος ορίζεται κατά τη δήλωση του πίνακα και παραμένει αμετάβλητο. Μπορείτε να διατρέξετε το πίνακα χρησιμοποιώντας //iterators// ή με χρήση for που γνωρίζεται από τη γλώσσα C. H δομή //std::array// υποστηρίζει random access iterators. 
 + 
 +===== Επίδοση της δομής ===== 
 + 
 +  * Η πράξη της ένθεσης ή της διαγραφής από τον τέλος του πίνακα έχει σταθερό κόστος **(O(1))** 
 +  * Η πράξη της ένθεσης ή της διαγραφής από το μέσο ή την αρχή του πίνακα συνεπάγεται την μετακίνηση όλων των στοιχείων που βρίσκονται δεξιότερα κατά μία θέση. Η επίδοση της εξαρτάται από την θέση της ένθεσης ή της διαγραφής σε σχέση με το τέλος του πίνακα. Ο επιμερισμένος χρόνος της συγκεκριμένης πράξης είναι γραμμικός στο μέγεθος των αποθηκευμένων στοιχείων του πίνακα **(Ο(Ν))**. 
 +  * Η πράξη της αναζήτησης είναι γραμμική στο μέγεθος των στοιχείων του πίνακα **(Ο(Ν))**. 
 +  * Η πρόσβαση στο i-στο στοιχείο του πίνακα έχει κόστος 1. 
 + 
 + 
 +===== Ορισμός και διάτρεξη πίνακα ===== 
 + 
 +<code cpp 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'; 
 +
 +</code> 
 + 
 +<code cpp 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; 
 +
 +</code> 
 + 
 +===== Πρόσβαση στα στοιχεία του πίνακα ===== 
 + 
 +<code cpp 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; 
 +
 +</code> 
 + 
 +Παρατηρούμε ότι στον παραπάνω κώδικα η πρόσβαση εκτός ορίων παράγει τερματισμό του προγράμματος μέσω segmentation fault. Εάν θέλουμε να μπορούμε να ελέγχουμε τις πιθανές λανθασμένες προσπελάσεις μέσω της διαχείρισης ενός exception υπάρχει η ισοδύναμη συνάρτηση [[http://www.cplusplus.com/reference/array/array/at/|at]] η οποία σε περιπτώσεις πρόσβασης εκτός ορίων πετάει exception του τύπου ''std::out_of_range'', το οποίο στη συνέχεια καλούμαστε να διαχειριστούμε. 
 + 
 +<code cpp 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; 
 +  } 
 +
 +</code> 
 + 
 + 
 + 
  
cpp/stl/array.1590590674.txt.gz · Last modified: 2020/05/27 13:44 (external edit)