cpp:stl:vector
Differences
This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
cpp:stl:vector [2020/05/27 17:27] – [Διαγραφή των περιεχομένων του πίνακα] gthanos | cpp:stl:vector [2023/05/29 19:12] (current) – [Πρόσβαση στα στοιχεία του πίνακα] gthanos | ||
---|---|---|---|
Line 1: | Line 1: | ||
====== std::vector ====== | ====== std::vector ====== | ||
- | Πρόκειται για μία δομή πίνακα του οποίου η χωρητικότητα μεταβάλλεται δυναμικά με βάση τις ανάγκες αποθήκευσης του προγράμματος. Η παρακάτω εικόνα είναι ενδεικτική της υφιστάμενης δομής δεδομένω που περιγράφει ένα //vector//. Παρατηρήστε ότι η χωρητικότητα ενός vector μπορεί να είναι μεγαλύτερη από τον αριθμό των αποθηκευμένων στοιχείων του. | + | Πρόκειται για μία δομή πίνακα του οποίου η χωρητικότητα μεταβάλλεται δυναμικά με βάση τις ανάγκες αποθήκευσης του προγράμματος. Η παρακάτω εικόνα είναι ενδεικτική της υφιστάμενης δομής δεδομένων που περιγράφει ένα //vector//. Παρατηρήστε ότι η χωρητικότητα ενός |
- | + | ||
- | {{ :cpp:stl: | + | |
+ | {{ : | ||
===== Επίδοσης της δομής ===== | ===== Επίδοσης της δομής ===== | ||
* Η πράξη της ένθεσης ή της διαγραφής από τον τέλος του πίνακα έχει σταθερό κόστος **(O(1))**. | * Η πράξη της ένθεσης ή της διαγραφής από τον τέλος του πίνακα έχει σταθερό κόστος **(O(1))**. | ||
- | * Η πράξη της ένθεσης ή της διαγραφής από το μέσο ή την αρχή του πίνακα συνεπάγεται την μετακίνηση όλων των στοιχείων που βρίσκονται δεξιότερα κατά μία θέση και η επίδοσης της εξαρτάται από την θέση της ένθεσης ή της διαγραφής σε σχέση με το τέλος του πίνακα. Ο επιμερισμένος χρόνος της συγκεκριμένης πράξης είναι γραμμικός στο μέγεθος των αποθηκευμένων στοιχείων του πίνακα **(Ο(Ν))**. | + | * Η πράξη της ένθεσης ή της διαγραφής από το μέσο ή την αρχή του πίνακα συνεπάγεται την μετακίνηση όλων των στοιχείων που βρίσκονται δεξιότερα κατά μία θέση και η επίδοση της εξαρτάται από την θέση της ένθεσης ή της διαγραφής σε σχέση με το τέλος του πίνακα. Ο επιμερισμένος χρόνος της συγκεκριμένης πράξης είναι γραμμικός στο μέγεθος των αποθηκευμένων στοιχείων του πίνακα **(Ο(Ν))**. |
* Η πράξη της αναζήτησης είναι γραμμική στο μέγεθος των στοιχείων του πίνακα **(Ο(Ν))**. | * Η πράξη της αναζήτησης είναι γραμμική στο μέγεθος των στοιχείων του πίνακα **(Ο(Ν))**. | ||
+ | * Η πρόσβαση στο i-στο στοιχείο του πίνακα έχει κόστος 1. | ||
+ | |||
+ | ===== Πρόσβαση στα στοιχεία του πίνακα ===== | ||
+ | |||
+ | Για τη συνάρτηση //vector// ισχύει η πρόσβαση μέσω των συναρτήσεων [[http:// | ||
+ | |||
+ | <code cpp vector_access.cpp> | ||
+ | #include < | ||
+ | #include < | ||
+ | using namespace std; | ||
+ | |||
+ | int main () { | ||
+ | vector< | ||
+ | cout << " | ||
+ | cout << " | ||
+ | |||
+ | try { | ||
+ | v.at(3) = 600; | ||
+ | cout << " | ||
+ | v.at(4) = 1; | ||
+ | cout << " | ||
+ | } catch(std:: | ||
+ | cout << ex.what() << endl; | ||
+ | } | ||
+ | } | ||
+ | </ | ||
- | ==== Ένθεση στον πίνακα ==== | + | ===== Ένθεση στον πίνακα |
Όπως προαναφέρθηκε, | Όπως προαναφέρθηκε, | ||
Line 71: | Line 96: | ||
</ | </ | ||
- | Παρατηρήστε ότι κάθε φορά που | + | Παρατηρήστε ότι κάθε φορά που |
- | ==== Διαγραφή των περιεχομένων του πίνακα ==== | + | ===== Διαγραφή των περιεχομένων του πίνακα |
Η διαγραφή των περιεχομένων ενός της κλάσης //vector// μπορεί να γίνει μέσω της μεθόδου [[http:// | Η διαγραφή των περιεχομένων ενός της κλάσης //vector// μπορεί να γίνει μέσω της μεθόδου [[http:// | ||
Line 81: | Line 106: | ||
<WRAP important 80% center round> | <WRAP important 80% center round> | ||
- | Όταν μία συνάρτηση της STL λαμβάνει ως παραμέτρους δύο // | + | Όταν μία συνάρτηση της STL λαμβάνει ως παραμέτρους δύο // |
</ | </ | ||
Line 108: | Line 133: | ||
| | ||
while(ints.size() > 0) { | while(ints.size() > 0) { | ||
- | auto pos = ints.begin() + ints.size()/ | + | auto middle |
- | ints.erase(pos, pos+2); | + | ints.erase(middle, middle+2); // erase position |
print(ints); | print(ints); | ||
} | } | ||
} | } | ||
- | |||
</ | </ | ||
+ | |||
+ | <WRAP tip center round 80%> | ||
+ | Παρατηρήστε ότι η εγγραφή '' | ||
+ | Ο λόγος που μεταγλωττίζεται και λειτουργεί επιτυχώς η παραπάνω δήλωση είναι ότι η κλάση //vector// επιτρέπει τη χρήση //Random Access Iterators// | ||
+ | </ | ||
<code cpp vector_erase_02.cpp> | <code cpp vector_erase_02.cpp> | ||
Line 158: | Line 187: | ||
void print(vector< | void print(vector< | ||
for(auto it = v.cbegin(); it!=v.cend(); | for(auto it = v.cbegin(); it!=v.cend(); | ||
- | cout << setw(3) << *it; | ||
- | cout << endl; | ||
- | } | ||
- | |||
- | template< | ||
- | void print_r(vector< | ||
- | for(auto it = v.crbegin(); | ||
cout << setw(3) << *it; | cout << setw(3) << *it; | ||
cout << endl; | cout << endl; | ||
Line 177: | Line 199: | ||
print(ints); | print(ints); | ||
| | ||
- | | + | ints.erase(ints.begin(), |
- | | + | print(ints); |
- | print(ints); | + | |
- | } | + | |
} | } | ||
</ | </ | ||
+ | |||
+ | <WRAP important 80% center round> | ||
+ | **Σημείωση: | ||
+ | |||
+ | Αποτελεί γενικότερο κανόνα της STL ότι παρέχει εξειδικευμένες συναρτήσεις για ένθεση και διαγραφή στην αρχή ή/και στο τέλος της δομής μόνο εάν η δομή υποστηρίζει τη γρήγορη ένθεση/ | ||
+ | </ | ||
+ | |||
cpp/stl/vector.txt · Last modified: 2023/05/29 19:12 by gthanos