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 bekommen

    hab 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 ab

    meine 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ürzt

    hatte 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 ersten

    if(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 ersten

    if(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'>&nbsp;<a href='index.php?f=0'><FONT color='#267e9b' class='PhorumNav'>Forum List</font></a>&nbsp;&nbsp;|&nbsp;&nbsp;<a href='post.php?f=6'><FONT color='#267e9b' class='PhorumNav'>New Topic</font></a>&nbsp;&nbsp;|&nbsp;&nbsp;<a href='search.php?f=6'><FONT color='#267e9b' class='PhorumNav'>Search</font></a>&nbsp;&nbsp;|&nbsp;&nbsp;<a href='login.php?f=6'><FONT color='#267e9b' class='PhorumNav'>Log In</font></a>&nbsp;</font></td>";
    body +="  <td align='right' width='40%'  bgcolor='#f2f2f2'><div class=nav><FONT color='#267e9b' class='PhorumNav'>&nbsp;<a href='list.php?f=6&t=1117391812&a=2'><FONT color='#267e9b' class='PhorumNav'>Older Messages</font></a>&nbsp;</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'>&nbsp;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&nbsp;</font></td>";
    body +="    <td class='PhorumListHeader' align='center'  bgcolor='#31a2c6' width='80' nowrap='nowrap'><FONT color='#FFFFFF'>Replies&nbsp;</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'>&nbsp;<img src='images/trans.gif' border=0 width=1 height=21 align='absmiddle'>&nbsp;<a href='/Forum/?catID=";
    body += token;//catID der url hinzufügen
    body += "'>";
    			token = strtok(NULL, Trenner);
    body += token;//Titel der Kategorie
    body +="</a>&nbsp;</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>&nbsp;</font></td>";
    body +="  <td class='PhorumListRow' align='center' width='80'  bgcolor='#FFFFFF' nowrap='nowrap'><FONT color='#303030' size=-1>not aviable&nbsp;</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 +="&nbsp;</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.


Anmelden zum Antworten