User Tools

Site Tools


cpp:stl:container_common_functions

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
cpp:stl:container_common_functions [2021/06/06 20:48] gthanoscpp:stl:container_common_functions [2023/05/30 19:18] (current) – [Αναζήτηση σε associative container και unordered associative container] gthanos
Line 1: Line 1:
-====== Κοινές συναρτήσεις για όλους τους 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// (υπάρχουν περιπτώσεις που λαμβάνει, αλλά αυτό είναι ενδεικτικό και συνιστάται να αποφεύγετε τη χρήση του).
  
 Παραδείγματα: Παραδείγματα:
  
-=== A. Ένθεση σε λίστα ===+==== A. Ένθεση στους sequence_containers list, forward_list, vector και dequeue ====
  
 Σε ένα //sequence container// είναι υποχρεωτικό να προσδιορίσουμε τη θέση εισαγωγής του στοιχείου μέσω ενός //iterator// που παρέχεται ως πρώτο όρισμα στη συνάρτηση //insert//. Σε ένα //sequence container// είναι υποχρεωτικό να προσδιορίσουμε τη θέση εισαγωγής του στοιχείου μέσω ενός //iterator// που παρέχεται ως πρώτο όρισμα στη συνάρτηση //insert//.
Line 40: Line 40:
 </code> </code>
  
-=== Β. Ένθεση σε set ===+<WRAP tip 80% center round> 
 +Η διαφορά ανάμεσα στις μεθόδους //insert// και //emplace// είναι η εξής:  
 +  * Στη μέθοδο //insert// παρέχουμε ένα αντικείμενο και η μέθοδος κατασκευάζει ένα αντίγραφο του μέσω του κατασκευαστή αντιγραφέα (copy-constructor) της κλάσης //Student//
 +  * Στη μέθοδο //empace// παρέχουμε τα ορίσματα μέσω των οποίων κατασκευάζεται ένα αντικείμενο τύπου Student, μέσω του κατασκευαστή ''Student(const char *name, int aem);''
 +</WRAP> 
 + 
 +==== Β. Ένθεση σε set, unordered set ====
  
 Σε ένα //associative container// δεν μπορούμε να προσδιορίσουμε τη θέση εισαγωγής του στοιχείου σε αυτόν. Ως εκ τούτου η //insert// δεν λαμβάνει ως πρώτο όρισμα έναν //iterator//. Σε ένα //associative container// δεν μπορούμε να προσδιορίσουμε τη θέση εισαγωγής του στοιχείου σε αυτόν. Ως εκ τούτου η //insert// δεν λαμβάνει ως πρώτο όρισμα έναν //iterator//.
  
-<code cpp string_set_insert.cpp>+<code cpp student_set_insert.cpp>
 #include <iostream>     // std::cout #include <iostream>     // std::cout
 #include <algorithm>    // std::copy #include <algorithm>    // std::copy
-#include <set>       // std::set +#include <set>         // std::set 
-#include <string>+#include "Student.hpp"
  
 int main () { int main () {
-  std::string strings[] = { std::string("gamma"), std::string("beta")std::string("delta") };+  Student students[] = { Student("Peter_Pan", 1234), Student("Tinker_Bell", 1235) };
                                                      
   std::cerr << "----- Init set -----" << std::endl;   std::cerr << "----- Init set -----" << std::endl;
-  std::set<std::string> myset; +  std::set<Student> myset; 
-  for(int i=0; i<3; i++)  +  for(int i=0; i<2; i++) { 
-    myset.insert(strings[i]);+    myset.insert(students[i]);  // copy-constructor, insert first 
 +    myset.insert(students[i]);    // copy-constructor, insert last 
 +  }
      
-  myset.emplace("alpha");  // argument construct, insert last+  myset.emplace("Mickey_Mouse", 1237);  // argument construct, insert last
      
   std::cerr << "-------------------------\n";   std::cerr << "-------------------------\n";
   std::cerr << "myset contains:";   std::cerr << "myset contains:";
-  for (std::set<std::string>::iterator it = myset.begin(); it!=myset.end(); it++)+  for (std::set<Student>::iterator it = myset.begin(); it!=myset.end(); ++it)
     std::cerr << ' ' << *it;     std::cerr << ' ' << *it;
   std::cerr << std::endl;   std::cerr << std::endl;
Line 75: Line 83:
 Η διαγραφή στοιχείου είναι ανάλογη της εισαγωγής και γίνεται μέσω της συνάρτησης //erase//. H συνάρτηση επιστρέφει έναν //iterator// στο επόμενο στοιχείο από αυτό που έχει διεγραφεί. Για τους //sequence containers// σε αναλογία με την διαδικασία εισαγωγής, η συνάρτηση λαμβάνει ως όρισμα έναν //iterator// που δηλώνει τη θέση διαγραφής από τον container. Για τους //associative containers// η διαγραφή γίνεται παρέχοντας ως όρισμα τη θέση του κλειδιού (μέσω //iterator//) ή την τιμή του κλειδιού που επιθυμούμε να διαγράψουμε. Η διαγραφή στοιχείου είναι ανάλογη της εισαγωγής και γίνεται μέσω της συνάρτησης //erase//. H συνάρτηση επιστρέφει έναν //iterator// στο επόμενο στοιχείο από αυτό που έχει διεγραφεί. Για τους //sequence containers// σε αναλογία με την διαδικασία εισαγωγής, η συνάρτηση λαμβάνει ως όρισμα έναν //iterator// που δηλώνει τη θέση διαγραφής από τον container. Για τους //associative containers// η διαγραφή γίνεται παρέχοντας ως όρισμα τη θέση του κλειδιού (μέσω //iterator//) ή την τιμή του κλειδιού που επιθυμούμε να διαγράψουμε.
  
-=== A. Διαγραφή από λίστα ===+==== A. Διαγραφή από λίστα ====
  
 Το παρακάτω παράδειγμα είναι από τη σελίδα [[http://www.cplusplus.com/reference/list/list/erase/|http://cplusplus.com/list/erase]] Το παρακάτω παράδειγμα είναι από τη σελίδα [[http://www.cplusplus.com/reference/list/list/erase/|http://cplusplus.com/list/erase]]
Line 113: Line 121:
  
   return 0;   return 0;
 +}
 </code> </code>
  
  
-=== B. Διαγραφή από set ===+==== B. Διαγραφή από set ====
  
 Το παρακάτω παράδειγμα είναι από τη σελίδα [[http://www.cplusplus.com/reference/set/erase/|http://cplusplus.com/set/erase]] Το παρακάτω παράδειγμα είναι από τη σελίδα [[http://www.cplusplus.com/reference/set/erase/|http://cplusplus.com/set/erase]]
Line 155: Line 164:
 </code> </code>
  
-==== Αναζήτηση στοιχείου ====+===== Αναζήτηση στοιχείου =====
  
 Η διαδικασία αναζήτησης ενός στοιχείου είναι διαφορετική εάν αναζητούμε σε //sequence container// ή σε //associative container//. Η διαδικασία αναζήτησης ενός στοιχείου είναι διαφορετική εάν αναζητούμε σε //sequence container// ή σε //associative container//.
Line 256: Line 265:
   std::unordered_set<std::string> myset;   std::unordered_set<std::string> myset;
   std::unordered_set<std::string>::iterator it;   std::unordered_set<std::string>::iterator it;
-  char* word[] = { "sugar", "choco", "milk", "banana", "coffee" };+  std::string word[] = { "sugar", "choco", "milk", "banana", "coffee" };
  
   // unordered_set some initial values:   // unordered_set some initial values:
Line 267: Line 276:
   if(it != myset.end()) {   if(it != myset.end()) {
     myset.erase (it);     myset.erase (it);
-    std::cout << "'buiscuits' erased\n";+    std::cout << "'biscuits' erased\n";
   }   }
   else    else 
-    std::cout << "'buiscuits' not found\n";+    std::cout << "'biscuits' not found\n";
      
   print_set(myset);   print_set(myset);
Line 304: Line 313:
  
 int main () { int main () {
-  vector<int> v;+  vector<int>= {1,2,3};
   array<int,6> a = {10, 20, 30, 40, 50, 60};   array<int,6> a = {10, 20, 30, 40, 50, 60};
- 
-  v.assign(a.begin()+1, a.end()-1); 
      
 +  
 +  /* Assigns 20, 30, 40, 50
 +  */
 +  v.assign(a.begin()+1, a.end()-1);      //    10         20      30      40      50       60
 +                                         //                                              ^
 +                                         //           begin()+1                         end()-1 
   print(v);    print(v); 
 } }
Line 314: Line 327:
  
 <WRAP tip 80% center round> <WRAP tip 80% center round>
-H συνάρτηση //assign// διαγράφει τα υφιστάμενα περιεχόμενα του //container// πριν ανάθεση των νέων περιεχομένων. Προσαρμόζει το μέγεθος του //container// ανάλογα με τον αριθμό των στοιχείων που θα εισάγει σε αυτόν.+H συνάρτηση //assign// διαγράφει τα υφιστάμενα περιεχόμενα του //container// πριν ανάθεση των νέων περιεχομένων. Επιπλέον, προσαρμόζει το μέγεθος του //container// ανάλογα με τον αριθμό των στοιχείων που θα εισάγει σε αυτόν.
 </WRAP> </WRAP>
- 
-  
cpp/stl/container_common_functions.txt · Last modified: 2023/05/30 19:18 by gthanos