Vector vs map ( map nefunguje) – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu
Reklama
Reklama

Vector vs map ( map nefunguje) – C / C++ – Fórum – Programujte.comVector vs map ( map nefunguje) – C / C++ – Fórum – Programujte.com

 

Hledá se programátor! Plat 1 800 € + bonusy (firma Boxmol.com)
xJakubS0
Newbie
31. 3. 2012   #1
-
0
-

Mel jsem vytvoreny vector, ve kterem jsem mel ulozene objekty Data:

class Data {
public:
  Data();
  ~Data();
  void setProtocol(unsigned int);
  unsigned int getProtocol();
  void setSrcip(string);
  string getSrcip();
  void setDstip(string);
  string getDstip(); 
private:
  unsigned int protocol;  
  string srcip;
  string dstip;
};

Obycejne jsem pouzival: 

typedef vector<Data> vData;

vData fronta;


void funkce (Data dat) {fronta.push_back(dat);}

klasicky se pak dalo pouzit: fronta.at(cislo_prvku).setProtocol(10);

Myslel jsem ze s mapou se pracuje podobne.ale nejde mi to, hlavne kdyzjsem predaval ukazatel na data ve vectoru do jine funkce. U mapy mi to nejde.

typedef map<string, Data> MapData;
MapData pamet;

string k = getKlic();

pamet[k] = dat;
funkce (pamet[k]); // !!!!!!!!!!!

PROBLEM NASTAVA, KDYZ CHCI ZAVOLAT FUNKCI VE KTERE JAKO PARAMETR PREDAVAM UKAZATEL NA DATA. V TETO FUNKCI POTE CHCI ZOBRAZIT HODNOTY TECHTO DAT A PRACOVAT S NIMA.

poradite mi jak na to, abych ukladal prvky do mapy. pak, nasel prvek,kteremu odpovida klic, a s timto prvkem pak pracoval ?

Nahlásit jako SPAM
IP: 46.47.170.–
Je beznadějné udělat blbuvzdorný program, protože blbci jsou geniální.
Reklama
Reklama
vitamin+8
Grafoman
31. 3. 2012   #2
-
0
-

#1 xJakubS
takto:

	typedef int Data ;
	map<string, Data> pamet;
	map<string, Data>::iterator i;

	pamet["omg"] = 1;   
	
	i = pamet.find("wtf");
	if(i != pamet.end())cout << "kluc: "<<i->first << ", hodnota: " << i->second << endl;
	else cout << "prvok wtf sa nenasiel" << endl;
	
	i = pamet.find("omg");
	if(i != pamet.end())cout << "kluc: "<<i->first << ", hodnota: " << i->second << endl;
	else cout << "prvok omg sa nenasiel" << endl;

pamet["omg"]   vlozi do mapy pair<string, Data>(string("omg"), Data())

ak chces v mape vyhladat prvky podla klucov bez toho aby si do mapy pridal prvok tak musis pouzit find (pripadne prechadzat kazdy prvok cez cyklus)

Nahlásit jako SPAM
IP: 178.143.60.–
obfuscate: "The cruel god Malloc will strike you down. "
ZMeson: "That's the C god. C++ has a new god. "
xJakubS0
Newbie
31. 3. 2012   #3
-
0
-

a kdyz potrebuji mit v objektu Data jeste ukazatel nebo iterator na prvek ve vectoru ktery obsahuje objekt Key? jak se s tim pracuje?

v objektu Key je jen:

 
class Key {

public:
  Key();
  ~Key();
  string keyData;
  unsigned int counter;
};

do nej budu ukladat klic z mapy jako string a jeste jednu hodnotu.

A potrebuju kdyz otevru mapu, najdu nejaky prvek (napr. ten "omg"), tak u nej bude ukazatel nebo iterator na prvek ve vectoru, ktery obsahuje ten string apod.

tedy zjednodusene. ziskam nova data. ulozim je podle klice do mapy a zaroven klic te mapy dam do vektoru. s tim ze na ten vektor potrebuji odkaz ktery umistim do mapy. (snad je to dobre vysvetlene)

jak se pak pracuje s takovym iteratorem ci ukazatelem? najdu prvek v mape podle klice. zjistim ukazatel nebo iterator  na prvek ve vectoru. ten bud upravim nebo smazu.  

  string k = dat.getKlic();
  Key key;
  vector<Key>::iterator iter;
  pamet[k] = dat;
  key.keyData = pamet[k].getKlic();
  key.counter = pamet[k].getCounter();
  fronta.push_back(key);
  pamet[k].iter_na_vector = fronta.end(); // mam spravne?

potrebuju ted tyto dve funkce (cteni jednotlivych hodnot v prvku vektoru a smazani prvku ve vektoru): 

cout << "iter: " << (*tmp).keyData << endl;
fronta.erase(iter);
Nahlásit jako SPAM
IP: 46.47.170.–
Je beznadějné udělat blbuvzdorný program, protože blbci jsou geniální.
vitamin+8
Grafoman
31. 3. 2012   #4
-
0
-

Nieco taketo? :

struct Data{
	vector<string>::iterator i;
	string *str;
	//tu mozes mat hociake atributy

};

vector<string> kluce;
map<string, Data> mapa;

kluce.push_back("kluc");
mapa["kluc"].i = kluce.end();
mapa["kluc"].i--;
mapa["kluc"].str = &kluce.front();

cout << *mapa["kluc"].str << " || " << *mapa["kluc"].i;

Samozrejme je dobre sa vyhnut zbytocnemu volaniu mapa["kluc"] lebo mapa nie je vector s nahodnym pristupom k prvkom.

Nahlásit jako SPAM
IP: 178.143.60.–
obfuscate: "The cruel god Malloc will strike you down. "
ZMeson: "That's the C god. C++ has a new god. "
xJakubS0
Newbie
31. 3. 2012   #5
-
0
-

super super... me tam chybelo iter--. protoze end() odkazuje na prazdne misto ze?

ok.jeste jaksmazu z vectoru ten jeden prvek pomoci iteratoru? 

vector<string>::iterator i = mapa["kluc"].i;
i->erase(); //????????
Nahlásit jako SPAM
IP: 46.47.170.–
Je beznadějné udělat blbuvzdorný program, protože blbci jsou geniální.
vitamin+8
Grafoman
31. 3. 2012   #6
-
0
-

   

vector<string> kluce;
vector<string>::iterator i = kluce.begin();	

kluce.erase(i);

Inak doporucujem ti tuto stranku, mas tam vsetko vysvetlene aj s prikladmi:

http://www.cplusplus.com/…ector/erase/

Nahlásit jako SPAM
IP: 178.143.60.–
obfuscate: "The cruel god Malloc will strike you down. "
ZMeson: "That's the C god. C++ has a new god. "
xJakubS0
Newbie
1. 4. 2012   #7
-
0
-

jo,tak to mam ale porad mi to hazi  Segmentation fault.

vypada to na radku 

vector<string>::iterator i = mapa["kluc"].i;
Nahlásit jako SPAM
IP: 46.47.170.–
Je beznadějné udělat blbuvzdorný program, protože blbci jsou geniální.
vitamin+8
Grafoman
1. 4. 2012   #8
-
0
-

Nezda sa mi ze by henten riadok mohol sposobit Segmentation fault.

Nahlásit jako SPAM
IP: 178.143.60.–
obfuscate: "The cruel god Malloc will strike you down. "
ZMeson: "That's the C god. C++ has a new god. "
xJakubS0
Newbie
1. 4. 2012   #9
-
0
-

me taky ne. vsechno jede. zapis novych prvku do mapy i vectoru.. po zapsani iteratoru do mapy a nasledne odzkouseni...vsechno jede. ale jakmile mi na vstup prijde prvek se stejnym klicem jako uz je v mape, tak kdyz ho upravuju a chci vzit iterator abych mohl prvek ve vectoru smazat a zapsat novy iterator na novy prvek, tak u toho radku, to klekne...

Nahlásit jako SPAM
IP: 46.47.170.–
Je beznadějné udělat blbuvzdorný program, protože blbci jsou geniální.
vitamin+8
Grafoman
1. 4. 2012   #10
-
0
-

Mozno bude chyba v tom mazani prvkov vo vectore. Vector je vlastne dynamicky alokovane pole. Vektorovy iterator je pointer. Ak zmazes prvok vo vectore, tak vsetky prvky co idu za nim sa musia presunut (pouziva sa bitova kopia, nevolaju sa copy constructori a destructori). Pri tomto presune sa ale nezmenia hodnoty dovtedy vytvorenych iteratorov, cize iteratori budu ukazovat na zle prvky.

Nahlásit jako SPAM
IP: 178.143.60.–
obfuscate: "The cruel god Malloc will strike you down. "
ZMeson: "That's the C god. C++ has a new god. "
xJakubS0
Newbie
1. 4. 2012   #11
-
0
-

no, popravde, zatim tam zadny vektor nemazu. ale dobre. rekneme ze to bude problem v budoucnu. jak to mam tedy resit? ja jsem tady v techto iteratorech, ukazatelich apod ztaceny...

Nahlásit jako SPAM
IP: 46.47.170.–
Je beznadějné udělat blbuvzdorný program, protože blbci jsou geniální.
vitamin+8
Grafoman
1. 4. 2012   #12
-
0
-

preco vlastne uchovavas kluce vo vektore?

ved ich mas ulozene v mape...

Nahlásit jako SPAM
IP: 178.143.60.–
obfuscate: "The cruel god Malloc will strike you down. "
ZMeson: "That's the C god. C++ has a new god. "
xJakubS0
Newbie
1. 4. 2012   #13
-
0
-

protoze musim uchovavat data, ktera prichazi na vstup. pri prichodu prozkoumam celou mapu zda tam prvek je nebo neni. (bud upravim nebo pridam). a potom kdyz mam pamet plnou, musim smazat nejake data. ale ty mazu podle jinych algoritmu. musim tedy uchovavat frekvenci jednotlivych dat, nebo casy.

Nevim o nicem co by dokazalo uchovavat data podle dvou klicu. takze mapu mam abych nasel primo vlozene prvky a vector funguje jako fronta, ktera ma v sobe "klic" podle nehoz prvky odstranuji. musim mit tedy mapu s vektorem propojene... 

Nahlásit jako SPAM
IP: 46.47.170.–
Je beznadějné udělat blbuvzdorný program, protože blbci jsou geniální.
vitamin+8
Grafoman
1. 4. 2012   #14
-
0
-

Mapa sa da pouzit aj na uchovavanie jednej hodnoty s viacerimi klucmi.

map<string, Data*>	pamet;    //v podstate "aliasy" pre data
list<Data>		skutocna_pamet;	//lepsie ako vector ak nepotrebujes nahodny pristup, adresa prvkov sa nemeni

skutocna_pamet.push_back(Data());

pamet["kluc1"] = &skutocna_pamet.back();
pamet["kluc2"] = &skutocna_pamet.back();
pamet["kluc3"] = &skutocna_pamet.back();
Nahlásit jako SPAM
IP: 178.143.60.–
obfuscate: "The cruel god Malloc will strike you down. "
ZMeson: "That's the C god. C++ has a new god. "
xJakubS0
Newbie
1. 4. 2012   #15
-
0
-

takze rikas ze to mam delat obracene... misto abych data ulozil do mapy, tak data ulozim do listu. a do mapy vlozim klice s adresami do listu na data....  

to je zajimavy napad....  promyslim.... jen... potrebuju jeden velmi dulezity pozadavek. a to je rychlost hledani. bude to podobne jako predtim. protoze vstupni soubory jsou kolem 1GB....

Nahlásit jako SPAM
IP: 46.47.170.–
Je beznadějné udělat blbuvzdorný program, protože blbci jsou geniální.
vitamin+8
Grafoman
1. 4. 2012   #16
-
0
-

Tie data vyhladavas podla akych kriterii? Len podla mena?

Nahlásit jako SPAM
IP: 178.143.60.–
obfuscate: "The cruel god Malloc will strike you down. "
ZMeson: "That's the C god. C++ has a new god. "
xJakubS0
Newbie
1. 4. 2012   #17
-
0
-

pri vstupu vzdy podle jmena, a pak v druhem pripade podle frekvence (tedy cisla)

EDIT: pro upresneni. vzdy kdyz je pamet plna a novy prvek neni obsazen v pameti.tak  potrebuju smazat data z pameti podle cisla.... neovlivni to teda nijak ten list.ze budu mazat kdekoliv...

Nahlásit jako SPAM
IP: 46.47.170.–
Je beznadějné udělat blbuvzdorný program, protože blbci jsou geniální.
vitamin+8
Grafoman
1. 4. 2012   #18
-
0
-

Na vyhladavanie podla mena by si mohol pouzit daco taketo:

template <class T>
class XMap{
	map<char, XMap> m;
	T data;
	public:
		T &operator[](const string &str){
			XMap *sub_map = this;
			for(const char &c : str){
				sub_map = &sub_map->m[c];
			}
			return sub_map->data;
		}
};
int main() {
		
	XMap<int> mapa;
	mapa["test"] = 7;
	mapa["test2"] = 9;
	mapa["test"] = 2;
	
	cout << mapa["test2"];
	cout << mapa["test"];
	
	cin.get();

	return EXIT_SUCCESS;
}

Pripadne pouzit miesto map<char, Xmap >  vector (bude to pametovo narocnejsie ale rychlejsie)

edit:

template <class T>
class XMap{
	vector<XMap> m;
	T data;
	public:
	    T &operator[](const string &str){
		XMap *sub_map = this;
		for(const char &c : str){
			if(sub_map->m.empty())sub_map->m.resize(255);	
			sub_map = &sub_map->m[c];
		}
		return sub_map->data;
	}
};
Nahlásit jako SPAM
IP: 178.143.60.–
obfuscate: "The cruel god Malloc will strike you down. "
ZMeson: "That's the C god. C++ has a new god. "
xJakubS0
Newbie
2. 4. 2012   #19
-
0
-

#14 vitamin
ohledne toho 14 prispevku...  

map<string, Data*>	pamet;
list<Data>		skutocna_pamet;	

jak potom budu pristupovat k tem datum?

iterator = pamet.find("kluc2");
iterator.second->setProtocol();
//pripadne smazani
skutocna_pamet.erase(iterator);

nebo 

pamet[kluc2].second->getProtocol();

pujde to tak nejak?

Nahlásit jako SPAM
IP: 46.47.170.–
Je beznadějné udělat blbuvzdorný program, protože blbci jsou geniální.
vitamin+8
Grafoman
2. 4. 2012   #20
-
0
-

   

iterator->second->setProtocol();
//alebo:
pamet[kluc2]->getProtocol();
Nahlásit jako SPAM
IP: 178.143.60.–
obfuscate: "The cruel god Malloc will strike you down. "
ZMeson: "That's the C god. C++ has a new god. "
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 89 hostů

Podobná vlákna

Image map — založil Jockie

Keyboard map — založil Rudolf

Open Street Map — založil PeJa

Vožit obrázek o map. — založil paking

Map a ArrayList problém — založil Martin Štraus

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032016 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý