Table of Contents

std::array

Πρόκειται για μία δομή πίνακα του οποίου το μέγεθος ορίζεται κατά τη δήλωση του πίνακα και παραμένει αμετάβλητο. Μπορείτε να διατρέξετε το πίνακα χρησιμοποιώντας iterators ή με χρήση for που γνωρίζεται από τη γλώσσα C. H δομή std::array υποστηρίζει random access iterators.

Επίδοση της δομής

Ορισμός και διάτρεξη πίνακα

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;
  }
}