Ok
class Gruppi
{
vector<int> hashGruppi;
public:
Gruppi();
Gruppi(int& hkparola)
{
hashGruppi.push_back(hkparola);
};
~Gruppi();
inline int hashGruppiSize() { return hashGruppi.size(); }
inline void inserisci(int& hkparola) { hashGruppi.push_back(hkparola); }
inline void svuota() { hashGruppi.clear(); }
inline vector<int> ritornaVettore() { return hashGruppi; }
inline void elimina(int& hkparola) {
for(vector<int>::iterator posIt6 = hashGruppi.begin(); posIt6 != hashGruppi.end(); ++posIt6) {
if(*posIt6==hkparola) {
*posIt6=hashGruppi.back();
hashGruppi.back()=hkparola;
hashGruppi.pop_back();
break;
}
}
}
};
inline int funzHash(string& parolaHash)
{
int h = 5381;
for (int i=0; i<parolaHash.size(); ++i) {
h = h * 33 + parolaHash[i];
}
h=abs(h);
return h;
}
int main()
{
vector<Gruppi*> vecGruppi;
vector<int> lettereGruppo;
map<int,int> keyGruppi;/// una map di <hash_key, group_id>
string input,parola,parola2;
int dimCoda = 0,b = 0;
char s;
while(input != "<END>") {
getline(cin, input);
stringstream ssin(input);
s=0,parola="",parola2="";
ssin >> s;
if (s == 'i') {
lettereGruppo.clear();
vecGruppi.clear();
keyGruppi.clear();
ssin >> dimCoda>> b;
}
else if (s == 'e') {
int x=0;
lettereGruppo.resize(dimCoda);
while(x < dimCoda) {
ssin >> parola;
int hk=funzHash(parola);
keyGruppi.insert(pair<int,int>(hk,x));
lettereGruppo[x]=parola.size();
vecGruppi.push_back(new Gruppi(hk));
x++;
}
}
else if (s == 'm' || s == 'u' || s == 's') {
ssin >> parola >> parola2;
int hk1=funzHash(parola),hk2=funzHash(parola2);
map<int,int>::iterator it;
map<int,int>::iterator it2;
int grupId1=0,grupId2=0;
bool ver0=false,ver1=false;
it=keyGruppi.find(hk1);
if(it != keyGruppi.end()) {
grupId1=it->second;
ver0=true;
}
if(s == 'm' || s == 'u') {
it2=keyGruppi.find(hk2);
if(it2 != keyGruppi.end()) {
grupId2=it2->second;
ver1=true;
}
}
if(ver0 && s == 's') { //qui devo stampare il totale di parola e lettere del vettore di parola1
cout<<vecGruppi[grupId1]->hashGruppiSize()<<" "<<lettereGruppo[grupId1]<<endl;
}
if(ver1 && ver0 && grupId2!=grupId1) {
if(s == 'm') { //qui devo spostare parola1 dal vettore di parola1 al vettore di parola2
vecGruppi[grupId1]->elimina(hk1);
vecGruppi[grupId2]->inserisci(hk1);
it->second=grupId2;
lettereGruppo[grupId1]-=parola.size();
lettereGruppo[grupId2]+=parola.size();
}
else if(s == 'u' ) { //qui devo unire il vettore di parola1 col vettore di parola2
map<int,int>::iterator it3;
vector<int> temp=vecGruppi[grupId1]->ritornaVettore();
for(vector<int>::iterator posIt3 = temp.begin(); posIt3 != temp.end(); ++posIt3) {
it3=keyGruppi.find(*posIt3);
it3->second=it2->second;
vecGruppi[grupId2]->inserisci(*posIt3);
}
vecGruppi[grupId1]->svuota();
lettereGruppo[grupId2]+=lettereGruppo[grupId1];
lettereGruppo[grupId1]=0;
}
}
}///else if (s == 'm' || s == 'u' || s == 's')
}///fine while(input != "<END>")
return 0;
Mi chiedevo come renderlo più performante, deve essere veloce almeno il doppio di quanto lo è ora