Both sides previous revisionPrevious revisionNext revision | Previous revisionNext revisionBoth sides next revision |
cpp:stl:container_common_functions [2020/05/29 09:36] – gthanos | cpp:stl:container_common_functions [2021/06/06 20:48] – gthanos |
---|
====== Κοινές συναρτήσεις για όλους τους containers ====== | ====== Κοινές συναρτήσεις για όλους τους containers ====== |
| |
==== Εισαγωγή στοιχείου ==== | ===== Εισαγωγή στοιχείου ===== |
| |
Με εξαίρεση την κλάση [[array|std::array]] που το μέγεθος των πινάκων που δημιουργεί είναι σταθερό και δηλώνεται κατά τη δήλωση του πίνακα, οι υπόλοιποι //containers// μπορούν να μεταβάλλουν το αριθμό των στοιχείων που αποθηκεύουν. Για την εισαγωγή ενός στοιχείου σε έναν //container// υπάρχουν οι συναρτήσεις //insert// για την εισαγωγή ενός αντιγράφου του στοιχείου στον container και //emplace// για την δημιουργία ενός αντικειμένου και εισαγωγή του στον //container//. Επιπλέον, μόνο για τους //sequence containers// η //insert// λαμβάνει ως πρώτο όρισμα έναν //iterator// που δηλώνει τη θέση εισαγωγής του στοιχείου στον container. Για τις υπόλοιπες κατηγορίες //containers//, η //insert// δεν λαμβάνει ως πρώτο όρισμα έναν //iterator//. Εάν λαμβάνει, αυτό είναι ενδεικτικό και καλό είναι να αποφεύγετε η χρήση του. | Με εξαίρεση την κλάση [[array|std::array]] που το μέγεθος των πινάκων που δημιουργεί είναι σταθερό και δηλώνεται κατά τη δήλωση του πίνακα, οι υπόλοιποι //containers// μπορούν να μεταβάλλουν το αριθμό των στοιχείων που αποθηκεύουν. Για την εισαγωγή ενός στοιχείου σε έναν //container// υπάρχουν οι συναρτήσεις //insert// για την εισαγωγή ενός αντιγράφου του στοιχείου στον container και //emplace// για την δημιουργία ενός αντικειμένου και εισαγωγή του στον //container//. Επιπλέον, μόνο για τους //sequence containers// η //insert// λαμβάνει ως πρώτο όρισμα έναν //iterator// που δηλώνει τη θέση εισαγωγής του στοιχείου στον container. Για τις υπόλοιπες κατηγορίες //containers//, η //insert// δεν λαμβάνει ως πρώτο όρισμα έναν //iterator//. Εάν λαμβάνει, αυτό είναι ενδεικτικό και καλό είναι να αποφεύγετε η χρήση του. |
</code> | </code> |
| |
==== Διαγραφή στοιχείου ==== | ===== Διαγραφή στοιχείου ===== |
| |
Η διαγραφή στοιχείου είναι ανάλογη της εισαγωγής και γίνεται μέσω της συνάρτησης //erase//. H συνάρτηση επιστρέφει έναν //iterator// στο επόμενο στοιχείο από αυτό που έχει διεγραφεί. Για τους //sequence containers// σε αναλογία με την διαδικασία εισαγωγής, η συνάρτηση λαμβάνει ως όρισμα έναν //iterator// που δηλώνει τη θέση διαγραφής από τον container. Για τους //associative containers// η διαγραφή γίνεται παρέχοντας ως όρισμα τη θέση του κλειδιού (μέσω //iterator//) ή την τιμή του κλειδιού που επιθυμούμε να διαγράψουμε. | Η διαγραφή στοιχείου είναι ανάλογη της εισαγωγής και γίνεται μέσω της συνάρτησης //erase//. H συνάρτηση επιστρέφει έναν //iterator// στο επόμενο στοιχείο από αυτό που έχει διεγραφεί. Για τους //sequence containers// σε αναλογία με την διαδικασία εισαγωγής, η συνάρτηση λαμβάνει ως όρισμα έναν //iterator// που δηλώνει τη θέση διαγραφής από τον container. Για τους //associative containers// η διαγραφή γίνεται παρέχοντας ως όρισμα τη θέση του κλειδιού (μέσω //iterator//) ή την τιμή του κλειδιού που επιθυμούμε να διαγράψουμε. |
Η διαδικασία αναζήτησης ενός στοιχείου είναι διαφορετική εάν αναζητούμε σε //sequence container// ή σε //associative container//. | Η διαδικασία αναζήτησης ενός στοιχείου είναι διαφορετική εάν αναζητούμε σε //sequence container// ή σε //associative container//. |
| |
=== Αναζήτηση σε sequence container === | ==== Αναζήτηση σε sequence container ==== |
| |
H αναζήτηση σε sequence container γίνεται μέσω της συνάρτησης [[http://www.cplusplus.com/reference/algorithm/find/|std::find]]. Όπως θα δείτε και από τον ενδεικτικό κώδικα στο link η συνάρτηση λειτουργεί διατρέχοντας τον //container// με την βοήθεια ενός //iterator//. Το κόστος αναζήτησης είναι γραμμικό στο πλήθος των στοιχείων του //container// και για αυτό δεν αποτελεί βέλτιστη επιλογή για //associative// και //unordered associative containers//. Δείτε το παρακάτω ενδεικτικό παράδειγμα αναζήτησης σε μία λίστα. Η συνάρτηση [[http://www.cplusplus.com/reference/algorithm/find/|std::find]] επιστρέφει έναν //iterator// που δείχνει στην πρώτη θέση που εμφανίζεται το στοιχείο που αναζητούμε (μπορεί να εμφανίζεται σε περισσότερες θέσεις). Εάν δεν υπάρχει το στοιχείο που αναζητούμε η συνάρτηση //find// επιστρέφει έναν //iterator// που δείχνει στο σημείο του //container// που δείχνει και η συνάρτηση //end//. Το παρακάτω παράδειγμα είναι ενδεικτικό της χρήσης της //find//. | H αναζήτηση σε sequence container γίνεται μέσω της συνάρτησης [[http://www.cplusplus.com/reference/algorithm/find/|std::find]]. Όπως θα δείτε και από τον ενδεικτικό κώδικα στο link η συνάρτηση λειτουργεί διατρέχοντας τον //container// με την βοήθεια ενός //iterator//. Το κόστος αναζήτησης είναι γραμμικό στο πλήθος των στοιχείων του //container// και για αυτό δεν αποτελεί βέλτιστη επιλογή για //associative// και //unordered associative containers//. Δείτε το παρακάτω ενδεικτικό παράδειγμα αναζήτησης σε μία λίστα. Η συνάρτηση [[http://www.cplusplus.com/reference/algorithm/find/|std::find]] επιστρέφει έναν //iterator// που δείχνει στην πρώτη θέση που εμφανίζεται το στοιχείο που αναζητούμε (μπορεί να εμφανίζεται σε περισσότερες θέσεις). Εάν δεν υπάρχει το στοιχείο που αναζητούμε η συνάρτηση //find// επιστρέφει έναν //iterator// που δείχνει στο σημείο του //container// που δείχνει και η συνάρτηση //end//. Το παρακάτω παράδειγμα είναι ενδεικτικό της χρήσης της //find//. |
</code> | </code> |
| |
=== Αναζήτηση σε associative container και unordered associative container === | ==== Αναζήτηση σε associative container και unordered associative container ==== |
| |
Επειδή η συνάρτηση //find// ψάχνει γραμμικά μέσα στο περιεχόμενο του container δεν είναι βέλτιστή για containers που περιγράφονται από δέντρα ή από πίνακα κατακερματισμού. Αυτοί οι //containers// διαθέτουν δικές τους εξειδικευμένες συναρτήσεις //find// που ταιριάζουν στα χαρακτηριστικά της περιεχόμενης δομής που χρησιμοποιούν. | Επειδή η συνάρτηση //find// ψάχνει γραμμικά μέσα στο περιεχόμενο του container δεν είναι βέλτιστή για containers που περιγράφονται από δέντρα ή από πίνακα κατακερματισμού. Αυτοί οι //containers// διαθέτουν δικές τους εξειδικευμένες συναρτήσεις //find// που ταιριάζουν στα χαρακτηριστικά της περιεχόμενης δομής που χρησιμοποιούν. |
Όλες οι παραλλαγές της συνάρτησης //find// επιστρέφουν έναν //iterator// που δείχνει στην πρώτη (ή στη μοναδική) εμφάνιση του στοιχείου που ψάχνουμε στον //container//. Σε περίπτωση που δεν βρεθεί το στοιχείο ο //iterator// δείχνει μετά το τέλος του //container// εκεί που δείχνει και ο //iterator// που επιστρέφεται από τη συνάρτηση //end//. | Όλες οι παραλλαγές της συνάρτησης //find// επιστρέφουν έναν //iterator// που δείχνει στην πρώτη (ή στη μοναδική) εμφάνιση του στοιχείου που ψάχνουμε στον //container//. Σε περίπτωση που δεν βρεθεί το στοιχείο ο //iterator// δείχνει μετά το τέλος του //container// εκεί που δείχνει και ο //iterator// που επιστρέφεται από τη συνάρτηση //end//. |
</WRAP> | </WRAP> |
| |
| ===== Ανάθεση των περιεχομένων ενός container από τα περιεχόμενα ενός άλλου container ===== |
| |
| Η ανάθεση των περιεχομένων ενός //container// από τα περιεχόμενα ενός άλλου //container// (δεν έχει σημασία ο τύπος) γίνεται μέσω της συνάρτησης //assign//. Παρακάτω δίνεται ένα παράδειγμα όπου αντιγράφονται τα περιεχόμενα ενός [[cpp:stl:array|std::array]] αντιγράφονται σε ένα [[cpp:stl:vector|std::vector]] με εξαίρεση το πρώτο και το τελευταίο στοιχείο του //array//. |
| |
| <code cpp vector_assign.cpp> |
| #include <iostream> |
| #include <vector> |
| #include <array> |
| #include <iomanip> |
| using namespace std; |
| |
| template<typename T> |
| void print(vector<T> v) { |
| for(auto it = v.cbegin(); it!=v.cend(); it++) |
| cout << setw(3) << *it; |
| cout << endl; |
| } |
| |
| int main () { |
| vector<int> v; |
| array<int,6> a = {10, 20, 30, 40, 50, 60}; |
| |
| v.assign(a.begin()+1, a.end()-1); |
| |
| print(v); |
| } |
| </code> |
| |
| <WRAP tip 80% center round> |
| H συνάρτηση //assign// διαγράφει τα υφιστάμενα περιεχόμενα του //container// πριν ανάθεση των νέων περιεχομένων. Προσαρμόζει το μέγεθος του //container// ανάλογα με τον αριθμό των στοιχείων που θα εισάγει σε αυτόν. |
| </WRAP> |
| |
| |