map-Elemente einem String zuweisen?

LadyMarion

Mitglied
Hallo,

ich habe eine map in C++:

Code:
    map<string, string> name_1;
    name_1[ "abc" ] = "Text_1";
    name_1[ "def" ] = "Text_2";
    name_1[ "ghi" ] = "Text_3";
    name_1[ "jkl" ] = "Text_4";
    name_1[ "mno" ] = "Text_5";

Jetzt soll es eine Funktion geben, die den strings test_1 und test_2 Werte aus der Map zuweist.
Wenn ich dann diese strings aufrufe, sollen mir die entsprechenden Werte ausgegeben werden.

In Perl existiert eine solche Funktion bereits, da sieht sie folgendermaßen aus:

Der Hash anstelle der map:
Code:
%name_1 = (abc=>"Text_1", def=>"Text_2", ghi=>"Text_3",
jkl=>"Text_4", mno=>"Text_5");

Die Subroutine:
Code:
sub meineFunktion {

  $test_1 = "$name_1[abc], $name_1[ghi], $name_1[mno]";
  $test_2 = "$name_1[abc], $name_1[jkl]";

return ($test_1, $test_2);
}

Wenn ich nun im main-Programm z.B. test_1 aufrufe und ausgebe, erhalte ich folgende Ausgabe:

Text_1, Text_3, Text_5

Ich bin nicht besonders fit in C++ und weiß nicht, wie ich das umsetzen kann.
Ich hoffe, Ihr könnt mir etwas auf die Sprünge helfen.

Vielen Dank!
 
Hallo,

ich komm hier einfach nicht weiter.

Ob das so funktioniert, weiß ich nicht, da ich bis zur Ausgabe gar nicht komme.

Es sieht folgendermaßen aus:

Ich habe eine Klasse "abc", in der die Funktion "string makeSW();" und die Variablen schwarz und weiss stehen.

Code:
class abc {
...
string makeSW();
string schwarz, weiß;
...
};

In dieser Funktion "makeSW()" steht dann die Map wie auch dieser Aufruf:
Code:
string abc::makeSW() {

    map<string, string> name_1;
    name_1[ "abc" ] = "Text_1";
    name_1[ "def" ] = "Text_2";
    name_1[ "ghi" ] = "Text_3";
    name_1[ "jkl" ] = "Text_4";
    name_1[ "mno" ] = "Text_5";

abc::schwarz = name_1["abc"] + ", " + name_1["ghi"] + ", " + name_1["mno"];
abc::weiss = name_1["ghi"] + ", " + name_1["jkl"];
}

Nun möchte ich im main-Program in der Instanz "Test" mehrere Funktionen aufrufen, die als Parameter schwarz und/oder weiss bekommen.

Code:
string schwarzweiss = Test.eineandereFunktion("irgendeinParameter",
"nocheiner", Test.schwarz);

Die Funktion "eineandereFunktion" gibt einen String zurück, der u.a. die Variablen schwarz und weiss enthält.

Code:
string abc::eineandereFunktion(string param1, string param2, string sw) {
	stringstream teststring;
	teststring<<
	"Anfang\n"
	"  IrgendeinText: "<<param1<<" zu "<<param2<<"\n"
	"    TextTextText\n"
	"    TextTextText\n"
	"  Hier steht es: "<<string sw<<"\n"
	"Ende\n"
	;
	return teststring.str();
}

Der string wird dann in eine Datei geschrieben. In dieser Datei soll dann stehen:

Code:
	Anfang
	  IrgendeinText: irgendeinParameter zu nocheiner
	    TextTextText
	    TextTextText
	  Hier steht es: Text_1, Text_3, Text_5
	Ende

So sollte das ganze vom Prinzip her aussehen.
Könnt Ihr mir weiterhelfen, wie sowas richtig funktioniert?

Vielen Dank
 
Hi.

Evtl. solltest du mal schreiben welche Probleme auftauchen? Compilerfehler/-warnungen?

Poste doch mal ein komplettes Programm so das man es schnell mal ausprobieren kann.

Ansonsten, Schönes WE.
 
Hallo,

das Ganze steht in einem ziemlich umfangreichen Programm. Jetzt wollte ich gerade die relevanten Stellen kopieren und hier posten, aber jetzt hab ich es so wie oben beschrieben doch hingekriegt.
Es funktioniert jetzt, ich musste nur an der map selbst was ändern.

Eigentlich sollte, je nachdem welcher Fall zutrifft, eine map aufgerufen werden. Dann habe ich zwar keine Fehlermeldung im Compiler bekommen, aber es wurden mir aber lediglich die Kommas ohne die Werte selbst ausgegeben. Jetzt hab ich die Bedingungen entfernt und alles wird korrekt dargestellt.

Funktioniert bei maps die if-else-Anweisung nicht?

Beispiel:
Code:
if (text == "irgendwas") {
    map<string, string> name_1;
    name_1[ "abc" ] = "Text_1";
    name_1[ "def" ] = "Text_2";
    name_1[ "ghi" ] = "Text_3";
} else {
    map<string, string> name_1;
    name_1[ "abc" ] = "Text_A";
    name_1[ "def" ] = "Text_B";
    name_1[ "ghi" ] = "Text_C";
}
 
Hi.
Funktioniert bei maps die if-else-Anweisung nicht?

Beispiel:
Code:
if (text == "irgendwas") {
    map<string, string> name_1;
    name_1[ "abc" ] = "Text_1";
    name_1[ "def" ] = "Text_2";
    name_1[ "ghi" ] = "Text_3";
} else {
    map<string, string> name_1;
    name_1[ "abc" ] = "Text_A";
    name_1[ "def" ] = "Text_B";
    name_1[ "ghi" ] = "Text_C";
}
Was hat das if/else mit den maps zu tun? Ansonsten kann man das so nicht sagen. Was ist denn "text"? (was für ein Typ?)

Gruß
 
Hallo,

die Werte in den Maps sind abhängig von der Version. Mit dem if-else wird also abgefragt, um welche es sich handelt und dann wird die entsprechende Map verwendet.

Beispiel:
Code:
string version;
if (version == "11.A") {
    map<string, string> name_1;
    name_1[ "abc" ] = "Text_1";
    name_1[ "def" ] = "Text_2";
    name_1[ "ghi" ] = "Text_3";
} else {
    map<string, string> name_1;
    name_1[ "abc" ] = "Text 1";
    name_1[ "def" ] = "Text 2";
    name_1[ "ghi" ] = "Text 3";
}

Die Maps unterscheiden sich also lediglich in dem Unterstrich.

Wie gesagt, so mit dem if-else, werden nur die Kommas und keine Werte ausgegeben, ohne das if-else funktioniert es einwandfrei.
 
Hallo,

die Werte in den Maps sind abhängig von der Version. Mit dem if-else wird also abgefragt, um welche es sich handelt und dann wird die entsprechende Map verwendet.

Beispiel:
Code:
string version;
if (version == "11.A") {
    map<string, string> name_1;
    name_1[ "abc" ] = "Text_1";
    name_1[ "def" ] = "Text_2";
    name_1[ "ghi" ] = "Text_3";
} else {
    map<string, string> name_1;
    name_1[ "abc" ] = "Text 1";
    name_1[ "def" ] = "Text 2";
    name_1[ "ghi" ] = "Text 3";
}
Du legst hier jeweils neue Variablen namens "name_1" an, die nur innerhalb des if bzw. else Blocks zugreifbar sind. D.h. nach der if/else Anweisung ist der Wert der Variablen weg.
C++:
string version;
map<string, string> name_1;
if (version == "11.A") {
    name_1[ "abc" ] = "Text_1";
    name_1[ "def" ] = "Text_2";
    name_1[ "ghi" ] = "Text_3";
} else {
    name_1[ "abc" ] = "Text 1";
    name_1[ "def" ] = "Text 2";
    name_1[ "ghi" ] = "Text 3";
}
Gruß
 
Zurück