2016-04-30 5 views
0
zurückgeben

Mein Ziel ist es, nach einem Schlüssel (objName) zu suchen, wenn es existiert, dann den Wert zurückzugeben.Verwenden Sie map :: find, um einen Schlüssel zu finden und den Wert

GameEntity * GameEntity::FindInContents(string objName) 
{ 
    for(map<string, GameEntity*>:: iterator iter = contents.begin(); iter != contents.end(); iter++) 
    { 
     if(contents.find(objName)== contents.end()) 
      return (iter->second); 
     else 
      return NULL; 
    } 
} 

jedoch, wenn ich den Code ausführen es bringt mich zu

/** There is also a templated copy ctor for the @c pair class itself. */ 
#ifndef __GXX_EXPERIMENTAL_CXX0X__ 
    template<class _U1, class _U2> 
pair(const pair<_U1, _U2>& __p) 
: first(__p.first), second(__p.second) { } 
#else 

Ich verstehe nicht, was das Problem. Danke im Voraus!

+2

Unrelated auf Ihre Frage, ich denke du meinst 'contents.find (objName) = contents.end()' .. . –

Antwort

3

Es besteht keine Notwendigkeit für eine Schleife als find einen Iterator auf das gefundene Element zurückgibt oder end() im Falle eines Streichholzes.

alles, was Sie brauchen, ist also:

map<string, GameEntity*>:: iterator iter = contents.find(objName); 
if(iter != contents.end()) // notice the != 
    return (iter->second); 
else 
    return NULL; 

Siehe http://en.cppreference.com/w/cpp/container/map/find für Details

+0

Es springt immer noch zu dem Fehler oben, nachdem ich das Programm ausgeführt habe. Bedeutet das, dass irgendwo anders in meinem Code ein Fehler aufgetreten ist? Es öffnet sich eine stl_pair.h Datei ... – Ares

+0

@Ares gibt es wahrscheinlich. –

+0

@Ares - ja, ich denke auch, dass du ein anderes Problem hast. Ein ausführliches Beispiel für den Suchcode finden Sie unter https://ideone.com/9M2Kny – 4386427

0

Warum in der Welt verwenden Sie eine For-Schleife?

Versuchen Sie folgendes:

decltype(auto) iter = contents.find(objName); 
return iter != contents.end() ? iter : nullptr; 

(Hinweis: Die NULL Makro ist veraltet, verwenden nullptr statt.)

+0

'decltype (auto)'? Wolltest du nur 'auto' benutzen? –

+0

@RSahu nein, ich bevorzuge 'declltype (auto)', weil es Referenztypen gibt, wo 'auto' nicht wäre. (In diesem Fall glaube ich, dass es 'declltype (contents) :: iterator &&' geben würde, während 'auto'' declltype (contents) :: iterator' geben würde. (Hinweis: Ich kann mich irren, ich habe derzeit keinen Zugriff auf einen Compiler ... um es zu testen) – Isaac

+0

'declltype (auto)' ist falsch. Das Argument zu "declype" muss ein Ausdruck sein. –

Verwandte Themen