map hasznalata objektumokkal

 ( juhasztibi | 2010. november 22., hétfő - 17:07 )

Sziasztok!

Szeretnek segitseget kerni toletek a targyban emlitett dologgal kapcsolatban.
Sokat meg nem hasznaltam c++-t lehet, hogy ezert nem boldogulok. Tehat a problemam a kovetkezo:

Van egy map-em ami egy stringet es egy objektumot var kulcs-ertek parnak. Kerdesem az lenne, hogy egy beszettelt objektumot hogyan tudok atadni a mapnek?
Mert ez igy nem mukodik:


int main(){
datas d;
d.setKategoria("akarmi");

map m;

m.insert(pair("valami",d.getKategoria()));

for(map::iterator i=m.begin(); i!=m.end();++i){
cout<<(*i).second.getKategoria()<

Ezzel probalkoztam. Strukturakkal mukodik a dolgog, csak objektumokkal nem.
A kerdesem az lenne, hogy milyen modon szurok be elemet a mapbe ha az egy objketum tipust var es hogyan tudom azt onnan kiolvasni?

Elore is koszonom a segiteseget!

udv,
Tibi

Hozzászólás megjelenítési lehetőségek

A választott hozzászólás megjelenítési mód a „Beállítás” gombbal rögzíthető.

huha most latom, hogy egy csom mindent leszedett az uzenetembol az oldal, pedig megjeloltem, hogy kod.
Sebaj a lenyeg a kerdesem lenne ugy is.

on all of them solvable

Ideje lenne lezárni a beszúrásnál használt taget!

-----
"Ha javulni látod a dolgokat, akkor valami fölött elsiklottál."

Koszi a hasznos tanacsot! :)

on all of them solvable

Ne koszongess, hanem zard le, elcseszi az oldalt.
--
Ki oda vagyik, hol szall a galamb, elszalasztja a kincset itt alant. | Gentoo Portal

Akkor majd én...

"...handing C++ to the average programmer seems roughly comparable to handing a loaded .45 to a chimpanzee." -- Ted Ts'o

Igy gondolod?
--
Ki oda vagyik, hol szall a galamb, elszalasztja a kincset itt alant. | Gentoo Portal

Valami ilyesmire gondolsz?


#include <map>
#include <string>
#include <iostream>

using namespace std;

class datas {
public:
string getKategoria(void) {
return kat;
}

void setKategoria(string arg) {
kat = arg;
}

private:
string kat;
};

int main() {
datas d;
d.setKategoria("akarmi");

// Beszur
map<string,datas> m;
m["valami"] = d;

// kiolvas
map<string,datas>::iterator i;
for (i=m.begin(); i!=m.end(); i++)
cout << i->second.getKategoria() << endl;

return 0;
}

Igen, koszonom! Valoban kicsit jobban belegondolva, hogy igy nezem a kododat nem is ertem, hogy nem jottem ra.
Pedig ez a resz annyira egyertelmu:

map m;
m["valami"] = d;

Koszonom meg egyszer az utbaigazitast!

udv,
Tibi

on all of them solvable

Nem mellékesen: ugye a copy konstruktor* jól van implementálva? Ha objektumokat használsz a standard könyvtárral, akkor ez nagyon fontos!

*:
class Objektum
{
Objektum( const Objektum &arg ); // erre gondolok
};

--
http://www.naszta.hu

Innen mindenki tudhatja, hogy az insert függvényt jóval hatékonyabb használni.


template <class MapType, class KeyArgType, class ValueArgType>
 typename MapType::iterator effectiveAddOrUpdate( MapType &m, KeyArgType &k, ValueArgType &v )
{
 MapType::iterator lb = m.lower_bound(k);

 if ( ( lb != m.end() ) && !( m.key_comp()( k, lb->first ) ) )
 {
  lb->second = v;
  return lb;
 }

 return m.insert( lb, make_pair<KeyArgType,ValueArgType>(k,v) );
}

--
http://www.naszta.hu

A te kódodban itt a hiba:

m.insert(pair<string,datas>("valami",d.getKategoria()));

A gond az, hogy d helyett a d.getKategoria() eredményét akarod a pair-ba rakni.
Ami gondolom string...

Így jó kell legyen.

m.insert(pair<string,datas>("valami",d));

Aminek még nézz utána az a copy-construktor, mert az bizony meghívódik...

"...handing C++ to the average programmer seems roughly comparable to handing a loaded .45 to a chimpanzee." -- Ted Ts'o