Both sides previous revisionPrevious revision | Next revisionBoth sides next revision |
cpp:stl:containers [2021/06/06 06:49] – gthanos | cpp:stl:containers [2021/06/06 07:42] – gthanos |
---|
| |
| |
===== Κοινά χαρακτηριστικά για όλους τους containers ===== | ===== Κοινά χαρακτηριστικά για όλους τους Containers ===== |
| |
==== Αντιγραφή των στοιχείων προς ένθεση μέσα σε ένα Container ==== | ==== Εισαγωγή των στοιχείων μέσα σε ένα Container ==== |
| |
=== Χρήση Copy-Constructor ή άλλου κατασκευαστή === | Η εισαγωγή των στοιχείων γίνεται πάντοτε δημιουργώντας ένα αντίγραφο του αντικειμένου προς εισαγωγή μέσα στον //container//. Οι τρόποι με τους οποίους δημιουργείται το αντίγραφο περιγράφεται παρακάτω. |
| |
| === Χρήση Copy-Constructor ή κατάλληλου κατασκευαστή === |
| |
Κατά την ένθεση ενός στοιχείου σε ένα //container//, δημιουργείται πάντοτε ένα αντίγραφο του στοιχείου σε αυτόν. Για παράδειγμα, για την ένθεση στοιχείων της κλάσης [[https://courses.e-ce.uth.gr/ECE326/doku.php?do=export_code&id=cpp:templates&codeblock=0|Student]] μέσα σε ένα //container list// τα στοιχεία θα αντιγραφούν εντός του //list// στο τέλος της λίστας (οι μέθοδοι //insert_back// και //emplace_back// εισάγουν στο τέλος της λίστας) ως εξής: | Κατά την ένθεση ενός στοιχείου σε ένα //container//, δημιουργείται πάντοτε ένα αντίγραφο του στοιχείου σε αυτόν. Για παράδειγμα, για την ένθεση στοιχείων της κλάσης [[https://courses.e-ce.uth.gr/ECE326/doku.php?do=export_code&id=cpp:templates&codeblock=0|Student]] μέσα σε ένα //container list// τα στοιχεία θα αντιγραφούν εντός του //list// στο τέλος της λίστας (οι μέθοδοι //insert_back// και //emplace_back// εισάγουν στο τέλος της λίστας) ως εξής: |
</WRAP> | </WRAP> |
| |
Κατά την εισαγωγή ενός στοιχείου μέσω των συναρτήσεων //insert//, //insert_back//, //emplace//, //emplace_back// δημιουργείται πάντα ένα νέο αντικείμενο στον //container//. Η δημιουργία του αντικείμένου γίνεται είτε μέσω του copy-constructor (μέθοδοι //insert//, //insert_back//) ή μέσω εκείνου του κατασκευαστή που λαμβάνει ως παραμέτρους τους τύπους των ορισμάτων που περνιούνται στις μεθόδους //emplace// ή //emplace_back//. Στο παράδειγμα μας, τα αντικείμενα κατασκευάζονται με τη βοήθεια του κατασκευαστή ''Student(const char *name, int aem)''. | Κατά την εισαγωγή ενός στοιχείου μέσω των συναρτήσεων //insert//, //insert_back//, //emplace//, //emplace_back// δημιουργείται πάντα ένα νέο αντικείμενο στον //container// που αποτελεί αντίγραφο του προς εισαγωγή αντικειμένου. Η δημιουργία του αντικειμένου γίνεται είτε |
| * μέσω του copy-constructor, όταν καλούνται οι μέθοδοι //insert//, //insert_front// και //insert_back// ή |
| * μέσω εκείνου του κατασκευαστή που λαμβάνει ως παραμέτρους τους τύπους των ορισμάτων που περνιούνται στις μεθόδους //emplace// ή //emplace_front// ή //emplace_back//. Οι μέθοδοι τύπου //emplace// δημιουργούν ένα αντικείμενο χρησιμοποιώντας τον κατασκευαστή της κλάσης αντί για τη χρήση του //copy-constructor//. Το δυνητικό πλεονέκτημα των μεθόδων αυτών είναι ότι δεν κατασκευάζεται ένα αντικείμενο που στη συνέχεια αντιγράφεται, αλλά δημιουργείται μόνο ένα αντικείμενο εξ' αρχής. Στο προηγούμενο παράδειγμα, τα αντικείμενα κατασκευάζονται με τη βοήθεια του κατασκευαστή ''Student(const char *name, int aem)''. |
| |
=== Χρήση operator = === | === Χρήση του operator = === |
| |
Αντιστοίχως, στο παρακάτω πρόγραμμα ανατίθεται σε ένα //container// τύπου //array// περιεχόμενα μέσω του τελεστή %%[]%%. Μεταγλωττίζοντας και εκτελώντας το πρόγραμμα θα παρατηρήσετε ότι καλείται ο τελεστής %%=%% (//operator=//) της κλάσης //Student//. | Αντιστοίχως, στο παρακάτω πρόγραμμα ανατίθεται σε ένα //container// τύπου //array// περιεχόμενα μέσω του τελεστή %%[]%%. Μεταγλωττίζοντας και εκτελώντας το πρόγραμμα θα παρατηρήσετε ότι καλείται ο τελεστής %%=%% (//operator=//) της κλάσης //Student//. |
std::array<Student,2> myarray; | std::array<Student,2> myarray; |
for(int i=0; i<2; i++) { | for(int i=0; i<2; i++) { |
myarray[i] = students[i]; | myarray[i] = students[i]; // we use operator= here |
} | } |
| |