einzelenes element aus std::map holen
-
ich muss aus map nen bestimmten inhalt rausbekommen
ich hab ne schleife dort wird eben alles durchgegangen
und dann aht man eben immer zugriff auf einen (i->first)
ich muss an einer stelle aber direkten zugriff auf das andere bekommenhab es versucht mit
std::cout<<r->params_["threatID"]<<std::endl;problem ich habe damit zwar direkten zugriff auf diese element
ist es aber nicht vorhanden schmiert das programm abmeine frage gibt es ne andere möglichkeit für nen direkten zugriff
oder kann man das abändern so das das programm nicht mehr abstürzthatte zwar schon etwas über get gelesen finde aber nicht die angaben wie es funktioniert es soll ja wenn es das element nicht findet 0 zurück
for (std::map<std::string, std::string>::const_iterator i = r->params_.begin(); i != r->params_.end(); i++) { body += "<br>" + i->first + " = " + i->second; forumindex = 1; int j = 1; if(i->first == "catID") // std::cout<<r->params_["threatID"]<<std::endl; {body += ForumCatIndex(body, i->second);} if(i->first == "threatID") {body += ForumThreat( body, i->second);} }
-
Morgen,
du koenntest mit map::count erst einmal schauen, ob der Schluessel ueberhaupt verhanden ist, ist dem so, dann
kannst du direkt drauf zugreifen:if(mapVar.count(key)) return mapVar[key];oder mit map::find. Liefert dir map::end(), falls der Schluessel nicht gefunden wird:
map<T>::iterator it = mapVar.find(key); if(it != mapVar.end()) do_something(it);Ich nehme mal an, dich stoert so ein bisschen die Ueberpruefungen, aber die kannst du leider nicht weg-
bekommen, zumindest faellt mir grad nicht ein wie.mfg
v R
-
die überprüfun stört micht nicht wirklich
weil ich nur die if bedingunegen brauche und zwar folgende 3 varianten:
catID und threatID nicht vorhanden dann ForumIndex( body);
catID vorhanden threatID nicht vorhanden dann ForumCatIndex(body,catID);
catID und threatID vorhanden dann ForumThreat( body,catID, threatID);mehr brauch ich ja nicht
nun gibts aber noch 2 probleme
zum erstenif(mapVar.count(key)) return mapVar[key];wie kann ich dort prüfen ob es nicht existiert und dann ne funktion ausführen
oder ist das dasselbe wie
if(mapVar.count(key)==TRUE) return mapVar[key];mein 2. problem wäre das die for schleife weg kann oder ?
muss dann dort was anderes hin (wegen iterator) oder ckann ich count auch ohne aufs map zugreifen
-
Skippy schrieb:
die überprüfun stört micht nicht wirklich
weil ich nur die if bedingunegen brauche und zwar folgende 3 varianten:
catID und threatID nicht vorhanden dann ForumIndex( body);
catID vorhanden threatID nicht vorhanden dann ForumCatIndex(body,catID);
catID und threatID vorhanden dann ForumThreat( body,catID, threatID);mehr brauch ich ja nicht
nun gibts aber noch 2 probleme
zum erstenif(mapVar.count(key)) return mapVar[key];wie kann ich dort prüfen ob es nicht existiert und dann ne funktion ausführen
Nun, map<T>::count liefert dir die Anzahl vorkommen des Schluessels 'key'. Ist keiner Vorhanden,
so liefert map<T>::count 0 und die Bedingung ist nicht erfuellt.oder ist das dasselbe wie
if(mapVar.count(key)==TRUE) return mapVar[key];Wie gesagt, ist der Schluessel in der map enthalten, liefert dir count, wie oft der Schluessel vorhanden
ist. Ist er vorhanden, ist die Bedingung erfuellt.mein 2. problem wäre das die for schleife weg kann oder ?
Wenn ich das richtig sehe, dann setzt du mit jeder Iteration einen Teil mehr einer HTML-Seite(?) zusammen?
Wenn dem so ist, dann kannst du auf die Schleife selbstverstaendlich nicht verzichten, denn du musst die
map ja nachwievor durchlaufen, um die Seite zusammenzufuegen.Liege ich mit meiner Vermutung richtig?
muss dann dort was anderes hin (wegen iterator) oder ckann ich count auch ohne aufs map zugreifen
Was meinst du mit count ohne auf die map zuzugreifen?
mfg
v R
-
zufälligerweise hat mein sinn und verstandlos rumprogrammieren sogar mal funktioniert
kannst dir ja mal in aktion ansehen
http://skippy.dyndns.ws:8080/Forum/
hier mal die funktion wie sie jetzt aussieht
else if (r->path_ == "/Forum/") { bgcolor = "#f2f2f2' link='#0033cc' alink='#0033cc' vlink='#800080"; title = "SKIPPSerV - Test Forum"; if(r->params_.count("catID")==FALSE && r->params_.count("threatID")==FALSE) {body = ForumIndex( body);} if(r->params_.count("catID")==TRUE && r->params_.count("threatID")==FALSE) {body += ForumCatIndex(body, r->params_["catID"]);} if(r->params_.count("catID")==TRUE && r->params_.count("threatID")==TRUE) {body += ForumThreat( body, r->params_["threatID"]);} }die seite selbst wird ja in der funktion selbst zusammengesetzt daher übergebe ich den string body in dem der inhalt der des body tags der html seite abgelegt wird.
hier mal als beispiel die funktion
std::string ForumIndex(std::string body) { char * dat_ein; char * token; char sLine[256]; char Trenner[] = "|@|"; dat_ein = "forum/forumindex.txt"; ifstream Datei(dat_ein); body +="<center>"; body +="<table border='0' width='760' cellpadding='0' cellspacing='0'>"; body +="<tr>"; body +=" <td class='logo' id='head' align='left'>"; body +=" <h1><a href='http://skippy.dyndns.ws' title='Skippy - sagt: das macht spaß'>SKIPPSerV - Test Forum<span></span></a></h1>"; body +=" </td></tr><tr><td align='left'>"; body +="<div class='BigPhorumForumTitle'><strong>SKIPPSerV Beta version Forum</strong></div>"; body +="<br />"; body +="<table width='100%' cellspacing='0' cellpadding='3' border='0'>"; body +="<tr>"; body +=" <td width='60%' nowrap='nowrap' bgcolor='#f2f2f2'><FONT color='#267e9b' class='PhorumNav'> <a href='index.php?f=0'><FONT color='#267e9b' class='PhorumNav'>Forum List</font></a> | <a href='post.php?f=6'><FONT color='#267e9b' class='PhorumNav'>New Topic</font></a> | <a href='search.php?f=6'><FONT color='#267e9b' class='PhorumNav'>Search</font></a> | <a href='login.php?f=6'><FONT color='#267e9b' class='PhorumNav'>Log In</font></a> </font></td>"; body +=" <td align='right' width='40%' bgcolor='#f2f2f2'><div class=nav><FONT color='#267e9b' class='PhorumNav'> <a href='list.php?f=6&t=1117391812&a=2'><FONT color='#267e9b' class='PhorumNav'>Older Messages</font></a> </font></div></td>"; body +="</tr>"; body +="</table>"; body +="<table class='PhorumListTable' width='100%' cellspacing='0' cellpadding='0' border='0'>"; body +="<tr>"; body +=" <td class='PhorumListHeader' bgcolor='#31a2c6'><FONT color='#FFFFFF'> Topics<img src='images/trans.gif' border=0 width=1 height=24 align='absmiddle'></font></td>"; body +=" <td class='PhorumListHeader' bgcolor='#31a2c6' width='150' nowrap='nowrap'><FONT color='#FFFFFF'>Moderator </font></td>"; body +=" <td class='PhorumListHeader' align='center' bgcolor='#31a2c6' width='80' nowrap='nowrap'><FONT color='#FFFFFF'>Replies </font></td>"; body +=" <td class='PhorumListHeader' bgcolor='#31a2c6' width='120' nowrap='nowrap'><FONT color='#FFFFFF'>Last Post</font></td>"; body +="</tr>"; if ( !Datei ) { cout << "Kann Datei ( " << dat_ein << " ) nicht öffnen" << endl; } while(!Datei.eof()) { Datei.getline(sLine, 256); // cout << "Zeile :" << sLine << endl; // Zeile auseinandernehmen. token = strtok(sLine, Trenner); body +="<tr>"; body +=" <td class='PhorumListRow' bgcolor='#FFFFFF'><FONT color='#303030'> <img src='images/trans.gif' border=0 width=1 height=21 align='absmiddle'> <a href='/Forum/?catID="; body += token;//catID der url hinzufügen body += "'>"; token = strtok(NULL, Trenner); body += token;//Titel der Kategorie body +="</a> </font><font class='PhorumNewFlag'>"; token = strtok(NULL, Trenner); body += token;//erweiterte Nachricht z.b. Wichtig, Neu, usw body +="</font></td>"; body +=" <td class='PhorumListRow' width='150' bgcolor='#FFFFFF' nowrap='nowrap'><FONT color='#303030'><strong>"; token = strtok(NULL, Trenner); body += token;//Author body += "</strong> </font></td>"; body +=" <td class='PhorumListRow' align='center' width='80' bgcolor='#FFFFFF' nowrap='nowrap'><FONT color='#303030' size=-1>not aviable </font></td>"; body +=" <td class='PhorumListRow' width='120' bgcolor='#FFFFFF' nowrap='nowrap'><FONT color='#303030' size=-1>"; token = strtok(NULL, Trenner); body += token;//Datum body +=" </font></td></tr>"; token = strtok(NULL, Trenner); while( token != NULL ) { // cout << "Token = " << token << endl; //für debugzwecke token = strtok(NULL, Trenner); } } return body; }
-
Hi, noch eine Ergänzung.
Da die count-Methode mehrfach benutzt wird, solltest du sie nur einmal aufrufen, also z.B.bool bCatId = (r->params_.count("catID") > 0); bool bThreadId = (r->params_.count("threatID") > 0); if(!bCatId && !bThreadId) { body = ForumIndex( body); } else if(bCatId && !bThreadId) { body = ...; } else if(bCatId && bThreadId) { body = ...; }Außerdem liefert count einen int zurück, keinen BOOL, also teste auf >0 bzw ==0.
Also kürzer und schneller...
P.S. Wenn du mehr Webseiten erzeugen willst, solltest du dich mal nach CGI-Programmierung erkundigen, dafür gibt es schon einfache, freie Klassen (z.B. uncgi, cgicc ...).
Zu empfehlen ist cgicc, aktuelle Version 3.2.1.
Außerdem solltest du evtl. Stylesheets verwenden, dann kannst du die Formatierungen, wie z.B. Farbe, Font etc. besser steuern, anstatt es für jeden HTML-Befehl('Tag') einzeln setzen zu müssen.