Εργαστήριο Τεχνολογίας Λογισμικού
+2 votes
226 views

Θέλω να ρωτήσω το παρακάτω. Στην προηγούμενη διάλεξη που έγινε μέρος της STL έγιναν τα lists και τα maps. Στη λίστα της STL μπορώ να έχω κάτι της μορφής

2 --> 3 --> 4 --> 5 --> ....

Αντίστοιχα, για τα maps μπορώ να έχω

(1, 5) --> (2, 7) --> (3, 10) --> ....

Λαμβάνοντας υπόψιν ότι σε μια custom λίστα μπορώ να τοποθετήσω κλειδί, δεδομένο, previous και next, αλλά μπορώ να φτιάξω και λίστα μέσα στη λίστα, θα μπορούσα να κάνω το ίδιο και στην STL με χρήση του Map <int, List<int>>; Και αν γίνεται αυτό, η υλοποίηση πως μπορεί να γίνει; Δηλαδή, έστω :

Map <int, List<int>> m1;

Αυτό λογικά θα δώσει ένα map που στο δεδομένο του (second) θα έχει μια λίστα. Πως θα μπορώ μετά, αν φυσικά γίνεται κάτι τέτοιο, να θέσω διαφορετικά δεδομένα στη λίστα, και εν γένει να χειριστώ τα δεδομένα στο second του map;

in progtech by (820 points)
edited by | 226 views

1 Answer

0 votes

Φυσικά. Κάπως έτσι:

#include <iostream>
#include <map>
#include <list>

using namespace std;

int main() {
  map<int, list<int>> m;
  m[42].push_back(1);
  m[42].push_back(2);
  m[42].push_back(3);
  for (int x : m[42])
    cout << x << endl;
}

Το πρόγραμμα θα δημιουργήσει τη λίστα [1, 2, 3] ως τιμή του m[42] και στη συνέχεια θα τυπώσει τις τιμές 1, 2, 3.

Προσέξτε ότι η αναφορά σε ένα στοιχείο του map (δηλαδή το πρώτο m[42] στο παραπάνω πρόγραμμα) κατασκευάζει μία κενή λίστα, στην οποία γίνονται push_back μετά οι τιμές 1, 2, 3. Αν θέλεις πρώτα να ελέγξεις αν το στοιχείο υπάρχει στο map ή όχι, εκεί χρειάζεσαι έναν iterator και εκεί θα χρησιμοποιήσεις explicitly το second.

map<int, list<int>>::iterator i = m.find(42);
if (i != m.end())
  i->second.push_back(4);
by (9.5k points)
0

Ευχαριστώ πολύ κ. Παπασπύρου! Παρατήρησα σε αυτό που γράψατε ότι εάν πρώτα κάνω έλεγχο τότε για να κάνω push back θα πρέπει να χρησιμοποιήσω το i->second, σε αντίθεση με το απο πάνω που δε χρησιμοποιείτε τον iterator και κάνετε κατευθείαν push back. Ποιο απο τα δύο είναι καλύτερο και γιατί αυτή η διαφορά;

301 questions

289 answers

288 comments

910 users