User Tools

Site Tools


cpp:stl:containers

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
Next revisionBoth sides next revision
cpp:stl:containers [2020/05/28 16:00] – [Διαγραφή στοιχείου] gthanoscpp:stl:containers [2020/05/28 17:10] – [Αναζήτηση στοιχείου] gthanos
Line 85: Line 85:
   for (int i=1; i<10; ++i) mylist.push_back(i*10);   for (int i=1; i<10; ++i) mylist.push_back(i*10);
  
-                              // 10 20 30 40 50 60 70 80 90 +                                          // 10 20 30 40 50 60 70 80 90 
-  it1 = it2 = mylist.begin(); // ^^ +  it1 = it2 = mylist.begin();             // ^^ 
-  advance (it2,6);            // ^                 ^ +  advance (it2,6);                        // ^                 ^ 
-  ++it1;                      //    ^              ^+  ++it1;                                  //    ^              ^
  
-  it1 = mylist.erase (it1);   // 10 30 40 50 60 70 80 90 +  it1 = mylist.erase (it1);               // 10 30 40 50 60 70 80 90 
-                              //    ^           ^+                                          //    ^           ^
  
-  it2 = mylist.erase (it2);   // 10 30 40 50 60 80 90 +  it2 = mylist.erase (it2);               // 10 30 40 50 60 80 90 
-                              //    ^           ^ +                                          //    ^           ^ 
-                              // 10 30 40 50 60 80 90 +                                          // 10 30 40 50 60 80 90 
-  ++it1;                      //              ^ +  ++it1;                                  //              ^ 
-  --it2;                      //           ^+  --it2;                                  //           ^
  
-  it1=mylist.erase (it1,it2); // 10 30 60 80 90 +  it1=mylist.erase (it1,it2);             // 10 30 60 80 90 
-                              //        ^+                                          //        ^
  
   std::cout << "mylist contains:";   std::cout << "mylist contains:";
Line 113: Line 113:
 === Διαγραφή από set === === Διαγραφή από set ===
  
-Το παρακάτω παράδειγμα είναι από τη σελίδα [[http://www.cplusplus.com/reference/list/set/erase/|http://cplusplus.com/set/erase]]+Το παρακάτω παράδειγμα είναι από τη σελίδα [[http://www.cplusplus.com/reference/set/erase/|http://cplusplus.com/set/erase]]
  
 <code cpp set_erase.cpp> <code cpp set_erase.cpp>
Line 128: Line 128:
   for (int i=1; i<10; i++) myset.insert(i*10);  // 10 20 30 40 50 60 70 80 90   for (int i=1; i<10; i++) myset.insert(i*10);  // 10 20 30 40 50 60 70 80 90
  
-  it = myset.begin(); +  it = myset.begin();                           // 10 20 30 40 50 60 70 80 90 
-  ++it;                                         // "it" points now to 20+                                                //  ^  
 +  ++it;                                         // 10 20 30 40 50 60 70 80 90 
 +                                                //     
  
-  myset.erase (it);+  myset.erase (it);                             // 10 30 40 50 60 70 80 90
  
-  myset.erase (40);+  myset.erase (40);                             // 10 30 50 60 70 80 90
  
-  it = myset.find (60); +  it = myset.find (60);                         // 10 30 50 60 70 80 90 
-  myset.erase (it, myset.end());+                                                //           ^ 
 +  myset.erase (it, myset.end());                // 10 30 50
  
   std::cout << "myset contains:";   std::cout << "myset contains:";
Line 146: Line 149:
 } }
 </code> </code>
 +
 +==== Αναζήτηση στοιχείου ====
 +
 +Η αναζήτηση ενός στοιχείου είναι διαφορετικά εάν αναζητούμε σε //sequence container// ή σε άλλου τύπου //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// που δείχνει στην πρώτη θέση που εμφανίζεται το στοιχείο που αναζητούμε (μπορεί να εμφανίζεται σε περισσότερες θέσεις). Το παρακάτω  παράδειγμα είναι ενδεικτικό.
 +
 +<code cpp find_in_vector.cpp>
 +// find example
 +#include <iostream>     // std::cout
 +#include <algorithm>    // std::find
 +#include <vector>       // std::vector
 +
 +int main () {
 +  // using std::find with array and pointer:
 +  int myints[] = { 10, 40, 30, 30, 40, 50, 30, 60, 30 };
 +  int *p;
 +  int search_int;
 +  
 +  std::cout << "Enter an integer to search for: ";
 +  std::cin >> search_int;
 +
 +  p = std::find (myints, myints+9, search_int);
 +  
 +  if (p != myints+9)
 +    std::cout << "First occurance of " << search_int << " in myints: " << *p << '\n';
 +  else
 +    std::cout << search_int << " not found in myints: " << '\n';
 +
 +  std::vector<int> myvector (myints,myints+9);
 +  auto it = myvector.begin();
 +  bool found = false;
 +  while(true) {
 +    it = find (it , myvector.end(), search_int);
 +    if (it != myvector.end()) {
 +      std::cout << search_int << " found in myvector at pos: " << it - myvector.begin() << '\n';
 +      it++;
 +      found = true;
 +    } else {
 +      if(!found)
 +        std::cout << search_int <<" not found in myvector\n";
 +      break;
 +    }
 +  }
 +
 +  return 0;
 +}
 +</code>
 +
 +=== Αναζήτηση σε associative container και unordered associative container ===
 +
 +Επειδή η συνάρτηση //find// ψάχνει γραμμικά μέσα στο περιεχόμενο του container δεν είναι βέλτιστή για containers που περιγράφονται από δέντρα ή από πίνακα κατακερματισμού. Αυτοί οι //containers// διαθέτουν δικές τους εξειδικευμένες //find// που ταιριάζουν στα χαρακτηριστικά της δομής που εξυπηρετούν. 
 +
 +=== Αναζήτηση σε set ===
 +
 +<code cpp find_in_set.cpp>
 +#include <iostream>
 +#include <set>
 +
 +int main ()
 +{
 +  std::set<int> myset;
 +  std::set<int>::iterator it;
 +
 +  // set some initial values:
 +  for (int i=1; i<=5; i++) myset.insert(i*10);    // set: 10 20 30 40 50
 +
 +  it=myset.find(20);
 +  myset.erase (it);
 +  myset.erase (myset.find(40));
 +
 +  std::cout << "myset contains:";
 +  for (it=myset.begin(); it!=myset.end(); ++it)
 +    std::cout << ' ' << *it;
 +  std::cout << '\n';
 +
 +  return 0;
 +}
 +</code>
 +
 +
 +=== Αναζήτηση σε unordered set ===
 + 
cpp/stl/containers.txt · Last modified: 2022/05/26 16:49 by gthanos