cpp:stl:vector
Differences
This shows you the differences between two versions of the page.
Next revision | Previous revisionNext revisionBoth sides next revision | ||
cpp:stl:vector [2020/05/27 16:07] – created gthanos | cpp:stl:vector [2020/06/01 09:01] – [std::vector] gthanos | ||
---|---|---|---|
Line 1: | Line 1: | ||
====== std::vector ====== | ====== std::vector ====== | ||
- | Πρόκειται για μία δομή πίνακα του οποίου η χωρητικότητα μεταβάλλεται δυναμικά με βάση τις ανάγκες αποθήκευσης του προγράμματος. Η χωρητικότητα ενός vector μπορεί να είναι μεγαλύτερη από τον αριθμό των αποθηκευμένων στοιχείων | + | Πρόκειται για μία δομή πίνακα του οποίου η χωρητικότητα μεταβάλλεται δυναμικά με βάση τις ανάγκες αποθήκευσης του προγράμματος. Η παρακάτω εικόνα είναι ενδεικτική της υφιστάμενης δομής δεδομένων που περιγράφει ένα //vector//. Παρατηρήστε ότι η χωρητικότητα ενός |
+ | |||
+ | {{ : | ||
+ | |||
+ | **Σημείωση: | ||
+ | |||
+ | ===== Επίδοσης της δομής ===== | ||
+ | |||
+ | * Η πράξη της ένθεσης ή της διαγραφής από τον τέλος του πίνακα έχει σταθερό κόστος **(O(1))**. | ||
+ | * Η πράξη της ένθεσης ή της διαγραφής από το μέσο ή την αρχή του πίνακα | ||
+ | * Η πράξη της | ||
+ | * Η πρόσβαση στο i-στο στοιχείο της λίστας έχει κόστος 1. | ||
+ | |||
+ | ===== Πρόσβαση στα στοιχεία του πίνακα ===== | ||
+ | |||
+ | Για τη συνάρτηση //vector// ισχύει η πρόσβαση μέσω των συναρτήσεων [[http:// | ||
+ | |||
+ | <code cpp vector_access.cpp> | ||
+ | #include < | ||
+ | #include < | ||
+ | using namespace std; | ||
+ | |||
+ | int main () { | ||
+ | vector< | ||
+ | cout << "size: " << v.size() << endl; | ||
+ | cout << "capa: " << v.capacity() << endl; | ||
+ | |||
+ | try { | ||
+ | v.at(3) = 600; | ||
+ | cout << " | ||
+ | v.at(4) = 1; | ||
+ | cout << " | ||
+ | } catch(std:: | ||
+ | cout << ex.what() << endl; | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | ===== Ένθεση στον πίνακα ===== | ||
+ | |||
+ | Όπως προαναφέρθηκε, | ||
+ | |||
+ | <code cpp vector_insert.cpp> | ||
+ | #include < | ||
+ | #include < | ||
+ | #include < | ||
+ | #include < | ||
+ | |||
+ | using namespace std; | ||
+ | |||
+ | template< | ||
+ | void print(vector< | ||
+ | for(auto it = v.cbegin(); it!=v.cend(); | ||
+ | cout << setw(3) << *it; | ||
+ | cout << endl; | ||
+ | } | ||
+ | |||
+ | int main() { | ||
+ | vector< | ||
+ | cout << "size: " << setw(2) << ints.size() ; | ||
+ | cout << " capacity: " << setw(2) << ints.capacity() << endl; | ||
+ | for(int i=0; i<10; i++) { | ||
+ | ints.push_back(i+1); | ||
+ | cout << "size: " << setw(2) << ints.size() ; | ||
+ | cout << " capacity: " << setw(2) << ints.capacity() << endl; | ||
+ | ints.insert(ints.begin(), | ||
+ | cout << "size: " << setw(2) << ints.size() ; | ||
+ | cout << " capacity: " << setw(2) << ints.capacity() << endl; | ||
+ | } | ||
+ | print(ints); | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | Η εκτύπωση του παραπάνω προγράμματος όσον αφορά το μέγεθος και τη χωρητικότητα του πίνακα είναι η εξής: | ||
+ | < | ||
+ | size: 0 capacity: | ||
+ | size: 1 capacity: | ||
+ | size: 2 capacity: | ||
+ | size: 3 capacity: | ||
+ | size: 4 capacity: | ||
+ | size: 5 capacity: | ||
+ | size: 6 capacity: | ||
+ | size: 7 capacity: | ||
+ | size: 8 capacity: | ||
+ | size: 9 capacity: 16 | ||
+ | size: 10 capacity: 16 | ||
+ | size: 11 capacity: 16 | ||
+ | size: 12 capacity: 16 | ||
+ | size: 13 capacity: 16 | ||
+ | size: 14 capacity: 16 | ||
+ | size: 15 capacity: 16 | ||
+ | size: 16 capacity: 16 | ||
+ | size: 17 capacity: 32 | ||
+ | size: 18 capacity: 32 | ||
+ | size: 19 capacity: 32 | ||
+ | size: 20 capacity: 32 | ||
+ | </ | ||
+ | |||
+ | Παρατηρήστε ότι κάθε φορά που γεμίζει ο πίνακας (δηλαδή size()==capacity()), | ||
+ | |||
+ | ===== Διαγραφή των περιεχομένων του πίνακα ===== | ||
+ | |||
+ | Η διαγραφή των | ||
+ | |||
+ | * '' | ||
+ | * '' | ||
+ | |||
+ | <WRAP important 80% center round> | ||
+ | Όταν μία συνάρτηση της STL λαμβάνει ως παραμέτρους δύο // | ||
+ | </ | ||
+ | |||
+ | <code cpp vector_erase_01.cpp> | ||
+ | #include < | ||
+ | #include < | ||
+ | #include < | ||
+ | #include < | ||
+ | |||
+ | using namespace std; | ||
+ | |||
+ | template< | ||
+ | void print(vector< | ||
+ | for(auto it = v.cbegin(); it!=v.cend(); | ||
+ | cout << setw(3) << *it; | ||
+ | cout << endl; | ||
+ | } | ||
+ | |||
+ | int main() { | ||
+ | vector< | ||
+ | for(int i=0; i<10; i++) { | ||
+ | ints.push_back(i+1); | ||
+ | ints.insert(ints.begin(), | ||
+ | } | ||
+ | print(ints); | ||
+ | |||
+ | while(ints.size() > 0) { | ||
+ | auto middle = ints.begin() + ints.size()/ | ||
+ | ints.erase(middle, | ||
+ | print(ints); | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | <WRAP tip center round 80%> | ||
+ | Παρατηρήστε ότι η εγγραφή '' | ||
+ | Ο λόγος που μεταγλωττίζεται και λειτουργεί επιτυχώς η παραπάνω δήλωση είναι ότι η κλάση | ||
+ | </ | ||
+ | |||
+ | <code cpp vector_erase_02.cpp> | ||
+ | #include < | ||
+ | #include < | ||
+ | #include < | ||
+ | #include < | ||
+ | |||
+ | using namespace std; | ||
+ | |||
+ | template< | ||
+ | void print(vector< | ||
+ | for(auto it = v.cbegin(); it!=v.cend(); | ||
+ | cout << setw(3) << *it; | ||
+ | cout << endl; | ||
+ | } | ||
+ | |||
+ | int main() { | ||
+ | vector< | ||
+ | for(int i=0; i<10; i++) { | ||
+ | ints.push_back(i+1); | ||
+ | ints.insert(ints.begin(), | ||
+ | } | ||
+ | print(ints); | ||
+ | |||
+ | while(ints.size() > 0) { | ||
+ | ints.erase(ints.begin()); | ||
+ | ints.erase(ints.end()-1); | ||
+ | print(ints); | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | <code cpp vector_erase_03.cpp> | ||
+ | #include < | ||
+ | #include < | ||
+ | #include < | ||
+ | #include < | ||
+ | |||
+ | using namespace std; | ||
+ | |||
+ | template< | ||
+ | void print(vector< | ||
+ | for(auto it = v.cbegin(); it!=v.cend(); | ||
+ | cout << setw(3) << *it; | ||
+ | cout << endl; | ||
+ | } | ||
+ | |||
+ | int main() { | ||
+ | vector< | ||
+ | for(int i=0; i<10; i++) { | ||
+ | ints.push_back(i+1); | ||
+ | ints.insert(ints.begin(), | ||
+ | } | ||
+ | print(ints); | ||
+ | |||
+ | ints.erase(ints.begin(), | ||
+ | print(ints); | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | <WRAP important 80% center round> | ||
+ | **Σημείωση: | ||
+ | |||
+ | Αποτελεί γενικότερο κανόνα της STL ότι παρέχει εξειδικευμένες συναρτήσεις για ένθεση και διαγραφή στην αρχή ή/και στο τέλος της δομής μόνο εάν η δομή υποστηρίζει τη γρήγορη ένθεση/ | ||
+ | </ | ||
+ | |||
- | {{ : |
cpp/stl/vector.txt · Last modified: 2023/05/29 19:12 by gthanos