Hi HaBo,
Sortierfunktionen:
Nun mein Problem: Ich versuche Wordlist nach dem Schema [AlphSortiertesWort]->
[liste aus richtigen wörtern] zu füllen, z.B [ekks]->[keks, sekk,...].
sortedWord soll demnach der Schlüssel der map sein und actWord der dazugehörigen Liste angehängt werden. Momentan habe ich jedoch das Problem, dass actWord und sortedWord zugleich geändert werden, es kommt also [ekks]->[ekks] raus. Mit DDD habe ich herausgefunden, dass beide dieselbe Instanz sind, d.h. sie verweisen auf denselben String. Frage:
1)Wie kriege ich zwei getrennte Instanzen hin?
2)Warum erzeugt = keine Kopie?
ratlos,
bad_alloc
Code:
map<string, list<string> > Wordlist;
set<string> Wordset;
//set wid gefüllt...
for(set<string>::iterator i = Wordset.begin(); i != Wordset.end(); ++i)
{
string actWord;
actWord = *i;//string vom iterator holen
//actWord kopieren, damit er nicht von AlphabeticalSort zerstört wird
string sortedWord = actWord;
sortedWord = AlphabeticalSort(sortedWord);
#ifdef DEBUG
cout << "got " << sortedWord << " and " << actWord << endl;
#endif
Wordlist[sortedWord].push_back(actWord);
#ifdef DEBUG
cout << "inserted " << sortedWord << " -> " << actWord << endl;
#endif
}
Code:
/**Vergleichsfunktion für qsort*/
int compare_chars( const void* a, const void* b )
{
char* Argument1 = (char*) a;
char* Argument2 = (char*) b;
if( *Argument1 < *Argument2 )
{
return -1;
}
else if( *Argument1 == *Argument2 )
{
return 0;
}
else
{
return 1;
}
}
/**Sortiert einen String alphabetisch
Da hier mich char* gearbeitet wird, ist diese Operation destrunktiv, sprich
der ursprüngliche String wird verändert!*/
string AnagramGeneratorObj::AlphabeticalSort(string in)
{
//umcasten und kopieren, damit qsort damit umgehen kann
string tmp;
tmp.assign(in);
char* cstr = (char*) tmp.c_str();
void* vptr = (void*) cstr;
qsort(vptr, tmp.length(), sizeof(char), compare_chars);
tmp = cstr; //in stdstring zurück
return tmp;
}
[liste aus richtigen wörtern] zu füllen, z.B [ekks]->[keks, sekk,...].
sortedWord soll demnach der Schlüssel der map sein und actWord der dazugehörigen Liste angehängt werden. Momentan habe ich jedoch das Problem, dass actWord und sortedWord zugleich geändert werden, es kommt also [ekks]->[ekks] raus. Mit DDD habe ich herausgefunden, dass beide dieselbe Instanz sind, d.h. sie verweisen auf denselben String. Frage:
1)Wie kriege ich zwei getrennte Instanzen hin?
2)Warum erzeugt = keine Kopie?
ratlos,
bad_alloc