G_tade Δημοσ. 27 Μαΐου 2012 Δημοσ. 27 Μαΐου 2012 Γεια σας, έχω το εξής πρόβλημα, έχω κάτι δεδομένα που πρέπει να τα οργανώσω χρησιμοποιώντας ένα map.Πιο συγκεκριμένα έστω πως έχω αυτές τις στήλες όνομα Επώνυμο Μισθός Ηλικία Γιάννης Καμμένος 3000 28 Γιώργος Αντωνίου 3500 28 Μιχάλης Παπαδόπουλος 3000 30 Κωστας Παπαδόπουλος 2500 25 Θέλω να φτάξω μια συνάρτηση η οποία να κατασκευάζει ένα STL map όπου ώς κλειδί τον συνδυασμό του ονόματος με το επώνυμο και ώς value τον μισθό. Ομως υπάρχουν κοινά επώνυμα και ονόματα και το map θέλει το κλειδί να είναι μοναδικό. Σκέφτηκα να χρησιμοποιήσω την pair ως εξής pair<string,string> one; one=make_pair("Γιαννης",Καμμένος"); και να δηλώσω έναν map : map< pair<string,string>,double> mappy; αλλά όταν κάνω insert τις τιμές έτσι mappy.insert(make_pair(one,3000)); δεν μου το δέχεται..μήπως είναι λάθος στην προκειμένη η χρήση της pair? Και επειδή θέλει να δημιουργηθεί μέσω συνάρτησης πως γίνεται να επιστρεφει η συνάρτηση map? Να δηλώσω ένα template map και να επιστρέφει η συνάρτηση μια αναφορά σε αυτό?
defacer Δημοσ. 27 Μαΐου 2012 Δημοσ. 27 Μαΐου 2012 Γενικά η σκέψη σου είναι σωστή και ο τρόπος που χρησιμοποιείς θα πρέπει να δουλέψει. Έκανες όμως μάλλον ένα τυπογραφικό: > one = make_pair("Γιαννης",Καμμένος"); Λείπει το εισαγωγικό πριν τον Καμμένο.
G_tade Δημοσ. 27 Μαΐου 2012 Μέλος Δημοσ. 27 Μαΐου 2012 έχω δηλώσει ένα τύπο pair: > typedef pair<string,string> key; σαν κλειδί και κάνω >key one ("ηδηδηδ","ξδξδξδξδ"); και μετά για να δηλώσω ένα στοιχείο του map: >map< key,double> mappy; Για να παρω στην έξοδο την τιμή και το κλειδί γράφω: >mappy.insert(make_pair(one,38)); map< key,double> ::iterator it; cout<<"MAPPY :"<<(*it).first<<endl; Αλλά μου χτυπάει λάθος στο cout με τον τελεστή <<.....γιατί όμως? έτσι δεν δηλώνεται ένας iterator?
παπι Δημοσ. 27 Μαΐου 2012 Δημοσ. 27 Μαΐου 2012 O iterator δειχνει στον γαμο του καραγκιοζη. Ο πρωτος iterator ειναι στο container::begin() δες και αν εχεις αποριες εδω ειμαστε >int main(int argc, char *argv[]) { typedef std::pair<std::string,std::string> Person; typedef std::map<Person,double> MyMap; MyMap map; map[Person("Prothipoyrgos","Pikramenos")] = 10000.0; map[Person("Tyxodiwkths","Tsipras")] = 20000.0; map[Person("Karamitros","Kammenos")] = -10.0; for(MyMap::iterator it = map.begin(); it != map.end(); ++it) std::cout <<"Idiothta: " << it->first.first << std::endl <<"Onoma:" << it->first.second << std::endl <<"Misthos:" << it->second << std::endl <<std::endl; return 0; }
G_tade Δημοσ. 27 Μαΐου 2012 Μέλος Δημοσ. 27 Μαΐου 2012 O iterator δειχνει στον γαμο του καραγκιοζη. Ο πρωτος iterator ειναι στο container::begin() δες και αν εχεις αποριες εδω ειμαστε >int main(int argc, char *argv[]) { typedef std::pair<std::string,std::string> Person; typedef std::map<Person,double> MyMap; MyMap map; map[Person("Prothipoyrgos","Pikramenos")] = 10000.0; map[Person("Tyxodiwkths","Tsipras")] = 20000.0; map[Person("Karamitros","Kammenos")] = -10.0; for(MyMap::iterator it = map.begin(); it != map.end(); ++it) std::cout <<"Idiothta: " << it->first.first << std::endl <<"Onoma:" << it->first.second << std::endl <<"Misthos:" << it->second << std::endl <<std::endl; return 0; } Οκ ωραία κατάλαβα! Και κάτι άλλο! Αν θέλω όλο αυτό να το φτιάξω σε μια συνάρτηση που θα δημιουργω ένα map και θα κάνω find () μέσα στην συνάρτηση, λογικά θέλω να μου επιστρέφει ένα στοιχείο τύπου map. Αν την συνάρτηση ας πουμε την ονομάσω Function θα πρέπει να χω κάτι τέτοιο? map & Function() { } πρέπει να χρησιμοποιήσω templates?
παπι Δημοσ. 27 Μαΐου 2012 Δημοσ. 27 Μαΐου 2012 Να σου πω την αληθεια δεν καταλαβα τι θελεις να κανεις.
G_tade Δημοσ. 27 Μαΐου 2012 Μέλος Δημοσ. 27 Μαΐου 2012 Προσπαθώ να φτιάξω μια συνάρτηση ώς εξής: >typedef pair<string,string> key; typedef map<key,double> mappy; template <class T, class S,class U> void Function(vector <T> & ref1, vector <S> & ref2, vector <U> & ref3); vector <string> Ονομα; vector <string> Ιδιότητα; vector <double> Μισθός; Τα vectors τα έχω δημιουργήσει στην main και θέλω να γεμίσω το map με τις τιμες αυτών των vectors. Τα 2 πρωτα vectors είναι για τα pairs που αποτελούν το κλειδί και το τρίτο είναι το value για το map..Και φτιάχνω αυτην την προφανέστατα άθλια συνάρτηση: >template <class T, class S,class U> void Function2(vector <T> & ref1, vector <S> & ref2, vector <U> & ref3) { for (int i=0;i<T.size();i++) { key(T[i],S[i]); mappy.insert(key,S[i]); } for(mappy::iterator it = map.begin(); it != map.end(); it++) { cout<<"Key: "<<it->first.first<<" "<<it->first.second<<" "<<"Value: "<<it->second<<endl; } } Προσπαθώ δηλαδή να εισάγω τις τιμές των vectors μεσω μιας for και γιαυτό τα περνάω σαν ορίσματα..
παπι Δημοσ. 28 Μαΐου 2012 Δημοσ. 28 Μαΐου 2012 Κατι τετοιο, αλλα δεν ειναι σωστο (κατι δε μου κολλαει) >template<class T1,class T2,class T3> std::map<std::pair<T1,T2>,T3> v3tomap( std::vector<T1>& v1, std::vector<T2>& v2, std::vector<T3>& v3) { typedef std::pair<T1,T2> MyPair; typedef std::map<MyPair,T3> MyMap; std::vector<T1>::iterator it1 = v1.begin(); std::vector<T2>::iterator it2 = v2.begin(); std::vector<T3>::iterator it3 = v3.begin(); MyMap map; for(; it1 != v1.end() && it2 != v2.end() && it3 != v3.end(); ++it1, ++it2, ++it3) { map[MyPair(*it1,*it2)] = *it3; } return map; } int main(int argc, char *argv[]) { typedef std::pair<std::string,std::string> Person; typedef std::map<Person,double> MyMap; std::vector<std::string> vec1; std::vector<std::string> vec2; std::vector<double> vec3; vec1.push_back("foo"); vec1.push_back("bar"); vec2.push_back("qqq"); vec2.push_back("eee"); vec3.push_back(120.0); vec3.push_back(55.0); MyMap map = v3tomap(vec1,vec2,vec3); return 0; }
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα