[C++] std::string -> action at a distance?

Hi HaBo,
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
    }
Sortierfunktionen:
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;
}
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
 
Also bei mir funktioniert dein Code

Code:
got 1Sginrt and String1
inserted 1Sginrt -> String1
got 2Sginrt and String2
inserted 2Sginrt -> String2
got 3Sginrt and String3
inserted 3Sginrt -> String3
 
Mit was für einem Compiler unter welchem System und mit welchen Flags?
Mein Code::Blocks ist momentan auf g++ -g eingestellt.
 
Visual Studio 2008 auf Win7

ohne Optimierung
Run-Time Error Checks aktiviert

/Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_UNICODE" /D "UNICODE" /Gm /EHsc /RTC1 /MDd /Fo"Debug\\" /Fd"Debug\vc90.pdb" /W3 /c /ZI /TP ".\Test.cpp"
 
Lösung: Statt hochriskanten Pointeroperationen, lieber mal die STL Dokumentation lesen :rolleyes:
Code:
string AnagramGeneratorObj::AlphabeticalSort(string in)
{
    sort(in.begin(), in.end()); //<-!
    return in;
}
 
Zurück
Oben