STL map Problem C(++)

cwriter

Erfahrenes Mitglied
Hallo Welt

Ich habe, wie der Titel schon sagt, ein Problem mit den Standard Template Library maps.

C++:
#include "stdio.h"
#include "stdlib.h"
#include "windows.h"
#include <map>

using namespace std;


int main()
{
     char String[256];
     
     strcpy(String,"Test");
     
     map< int, char* > MeineMap;
     map< int,char* >::iterator it;
     
     MeineMap.insert(make_pair(0,String));

     printf("%s\n",MeineMap);
     
     strcpy(String,"Test2");
    
     printf("%s\n",MeineMap);

     getch();
     return 0;
}

Die von mir erwartete Ausgabe:
Code:
Test
Test

Und die Tatsächliche:
Code:
Test
Test2

Ich schliesse daraus, dass die Map kein Speicher, sondern eine Art Linker ist, die nur auf andere Speicheradressen verweist.
Wie kann ich das verhindern? Gibt es eine Alternative zur map, oder gibt es für die map eine eigene Funktion, die direkt Werte speichert? Oder wisst ihr, wie man trotzdem den "String"-Speicher weiterverwenden kann?

Gruss
cwriter
 
Hi.
Ich schliesse daraus, dass die Map kein Speicher, sondern eine Art Linker ist, die nur auf andere Speicheradressen verweist.
Die std::map verweist auf genau das, was du als zweiten Template-Parameter angibst. Du hast spezfiziert, das die Schlüssel ints und die Werte Zeiger auf char sind - und genau das sind sie dann eben auch... :eek:

Verwende doch einfach std::map<int, std::string>.

Gruß
 
Hölle, entweder ich habe eine Revolution verschlafen oder du massig Glück:

Du kannst doch nicht eine Map als String mit printf ausgeben**** Das sollte dir eigentlich um die Ohren fliegen.

Gib die korrekt aus, dann siehst du auch wirklich das zweite Ergebnis (wie deepthroat erklärt hat):

Code:
map<int,char*>::iterator  it( MeineMap.begin() );
while ( it != MeineMap.end() )
{
  printf( "%s\n", it->second );
  ++it;
}
 
Zuletzt bearbeitet:
@deepthroat

Aber ich würde sehr gerne mit den C-Strings arbeiten und einen Array akzeptiert er nicht. Und strcpy() funktioniert ja nicht mit Strings, da gibt's doch die Zuweisung String="Text" ?


@Endurion

Oh, ja :-). Meinte ich auch nicht so. Es sollte
C++:
char String[256];
     
     strcpy(String,"Test");
     
     map< int, char* > MeineMap;
     map< int, char* >::iterator it;
     
     MeineMap.insert(make_pair(0,String));

	 it = MeineMap.find(0);

	 printf("%s\n",it->second);
     
     strcpy(String,"Test2");
    
	 printf("%s\n",it->second);

     getch();
     return 0;
heissen. Habe ich wohl falsch abgetippt.

Vielen Dank für die bisherige Hilfe

cwriter
 
Aber ich würde sehr gerne mit den C-Strings arbeiten und einen Array akzeptiert er nicht.
Für die Ablage in der map kannst du trotzdem mit std::string arbeiten - dann speicherst du eine Kopie deines C-Strings. Aus einem std::string bekommt man auch recht leicht ( mit c_str() ) wieder einen C_String.
C++:
char String[256];
strcpy(String,"Test");
 
std::map<int,std::string> MeineMap;
MeineMap[0] = String;
 
printf( "%s\n", MeineMap[0].c_str() );
 
strcpy(String,"Test2");
printf( "%s\n", MeineMap[0].c_str() );
Gruß
MCoder
 
Zurück