Newsgroup: it.comp.programmare.win32
Titolo: Vector o Array intelligente?

Salve a tutti!
Dunque, io sto costruendo un framework per win32.
Il problema nasce dal fatto che successivamente devo rintracciare l'oggetto
base di ogni controllo partendo dall'HWND. Attualmente usavo una coppia di
vector<HWND> e vector<SuitWndList> (scusate...sarebbe la classe degli
oggetti interessata).
Il dubbio che mi sorge č: č giusto fare cosě? Il vector fa parte della
libreria standard? Sarebbe meglio usare due coppie di array che faccio
crescere all'occorenza?
Oppure c'č un metodo migliore?
Nel caso entrambe le mie soluzioni proposte non sono valide, mi postate
qualche idea.
Ultima domanda (per chi conosce anche Java): esiste nella libreria standard
o in quella di Win l'equivalente della classe java.util.HashTable?
TIA
    Shogun

 crescere all'occorenza?
Il template vector fa parte della STL (Standard Template Library) fornita ad
es. insieme al VC++.
Ti consiglio di utilizzare il template map.
es:
map<CString, int> m;
m["Uno"] = 1;
m["Due"] = 2;
cout << m["Uno"] << m["Due"];
output del programma
12
In pratica mette in corrispondenza due tipi di dati in questo caso una
Stringa con un intero.
Attenzione: le stringhe devono essere tutte divere non e' possibile la
situazione:
m["Uno"] = 1, 2, 3, ...
Nel tuo caso dovrebbe essere:
map<HWND, SuitWndList>
Saluti, Antonio.

 m["Uno"] = 1, 2, 3, ...
Se c'č bisogno di assegnare piů valori alla stessa chiave č possibile usare
il template std::multimap<> al posto di std::map<>.
Saluti,
Marco

Grazie ad entrambi, era proprio ciň che mi serviva...
--
Shogun
-->"La conoscenza dev'essere libera perchč non c'č conoscenza che non sia
potere"
-->"La madre degli imbecilli č sempre incinta.

 map<CString, int> m;
std::map <std::string, int> m;
Visto che ha detto che sta scrivendo una framework per Win32, non penso 
usi MFC... Quindi CString se la scorda...
-- 
Andrea Bergia - studente
Linux Registred User #281550


Ha ragione...una domanda...in una map come trovo l'index di un valore
partendo dalla chiave? Cioč, so che usa la find, ma mi ritorna
l'iterator...(a proposito, chi me li spiega brevemente?)...io invece vorrei
un int (cioč l'index)...grazie!
Per finire...una piccola domanda pseudo-OT: Chi mi consiglia un buon
newsreader molto personalizzabile?


 l'iterator...
Proprio perché nei contenitori standard si usano gli iteratori e non gli
indici. Concettualmente l'indice in una std::map corrisponde alla chiave,
per quanto ne so non esiste un metodo di std::map che restituisca
direttamente un indice numerico (mi viene in mente solo di utilizzare la
differenza tra l'iteratore restituito da find() e quello restituito da
begin(), ma non so quanto possa essere legale). A cosa ti serve questo
indice?
Marco


Forse a niente...cioč, se io dichiaro una map<int,char*> e faccio find(int
i), mi restuisce il char* associato a int? Se sě, allora ho risolto...


 --
mah, io farei cosě:
//versione 1: sono SICURO che i sia una chiave:
map<int,char*> theMap;
char* result= theMap[i];
//versione 2: non so se i č una chiave valida:
map<int,char*>::const_iterator it=theMap.find(i);
if(it==theMap.end())
{
    //chiave non trovata
}
else
{
    char* result=(*it).second;
}
Ciao,
--
zello

 i), mi restuisce il char* associato a int? Se sì, allora ho risolto...
No, ti restituisce l'iteratore che punta alla coppia chiave-valore trovata
(la quale sarebbe un oggetto di tipo std::pair<chiave, valore>):
typedef std::map<int, std::string> String_map;
void test(int i, const String_map &mymap)
{
    String_map::const_iterator it = mymap.find(i);
    if (it != mymap.end()) {    // se l'elemento non viene trovato, find()
restituisce l'iteratore end()
        std::cout << "L'elemento con chiave " << i << " corrisponde alla
stringa " << it->second << "\n";
    } else {
        std::cerr << "Elemento con chiave " << i << " non trovato!\n";
    }
}
Per ottenere il valore corrispondente ad una certa chiave i, in realtà,
basta usare l'operatore [] in questo modo:
void test2(int i, String_map &mymap)
{
    std::cout << "L'elemento con chiave " << i << " corrisponde alla stringa
" << mymap[i] << "\n";
}
Questo esempio fa quasi la stessa cosa del precedente, con la differenza che
l'operatore [], dovendo in ogni caso restituire un valore valido, crea una
stringa vuota associata ad i nel caso in cui un valore con chiave i non sia
già presente nella mappa. Nell'esempio precedente invece, la presenza del
valore nella mappa veniva testato prima con find() per evitare inserimenti
automatici inutili. Per questo motivo, nella funzione test2() devi passare
come parametro una "String_map" e non una "const String_map", perché
l'operatore [], per il motivo appena detto, può anche vedersi costretto a
modificare la mappa (che quindi non può essere const).
Se non hai ben chiara la nozione di iteratore, allora non potrai mai usare
le classi della STL, quindi ti consiglio di leggere un buon libro o cercare
qualche documento su internet.
Marco