Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

Δημοσ.

Γεια σας,

 

έχω το εξής πρόβλημα, έχω κάτι δεδομένα που πρέπει να τα οργανώσω χρησιμοποιώντας ένα 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 και να επιστρέφει η συνάρτηση μια αναφορά σε αυτό? :cry:

Δημοσ.

Γενικά η σκέψη σου είναι σωστή και ο τρόπος που χρησιμοποιείς θα πρέπει να δουλέψει. Έκανες όμως μάλλον ένα τυπογραφικό:

 

>    one = make_pair("Γιαννης",Καμμένος");

 

Λείπει το εισαγωγικό πριν τον Καμμένο.

Δημοσ.

έχω δηλώσει ένα τύπο 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?

Δημοσ.

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; 
}

 

Δημοσ.

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?

Δημοσ.

Προσπαθώ να φτιάξω μια συνάρτηση ώς εξής:

 

>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 και γιαυτό τα περνάω σαν ορίσματα..

Δημοσ.

Κατι τετοιο, αλλα δεν ειναι σωστο (κατι δε μου κολλαει)

 

>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; 
}

 

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...