
Wir können nichts tun
Ich versuche zu überprüfen, ob sich ein bestimmter Schlüssel in einer Karte befindet, und kann dies irgendwie nicht tun:
typedef map<string,string>::iterator mi;
map<string, string> m;
m.insert(make_pair("f","++--"));
pair<mi,mi> p = m.equal_range("f");//I'm not sure if equal_range does what I want
cout << p.first;//I'm getting error here
Wie kann ich also drucken, was in p steht?
Benutzen map::find
if ( m.find("f") == m.end() ) {
// not found
} else {
// found
}

DavidRR
Um zu überprüfen, ob ein bestimmter Schlüssel in der Karte vorhanden ist, verwenden Sie die count
Mitgliedsfunktion auf eine der folgenden Arten:
m.count(key) > 0
m.count(key) == 1
m.count(key) != 0
Das Dokumentation zum map::find
sagt: “Eine weitere Elementfunktion, map::count
kann verwendet werden, um nur zu prüfen, ob ein bestimmter Schlüssel vorhanden ist.”
Das Dokumentation zum map::count
sagt: “Da alle Elemente in einem Map-Container eindeutig sind, kann die Funktion nur 1 (wenn das Element gefunden wird) oder Null (andernfalls) zurückgeben.”
Um einen Wert aus der Karte über einen Schlüssel abzurufen, von dem Sie wissen, dass er existiert, verwenden Sie Karte::at:
value = m.at(key)
nicht wie map::operator[], map::at
erstellt keinen neuen Schlüssel in der Zuordnung, wenn der angegebene Schlüssel nicht vorhanden ist.
C++20 gibt uns std::map::contains
das zu tun.
#include <iostream>
#include <string>
#include <map>
int main()
{
std::map<int, std::string> example = {{1, "One"}, {2, "Two"},
{3, "Three"}, {42, "Don\'t Panic!!!"}};
if(example.contains(42)) {
std::cout << "Found\n";
} else {
std::cout << "Not found\n";
}
}
Sie können verwenden .find()
:
map<string,string>::iterator i = m.find("f");
if (i == m.end()) { /* Not found */ }
else { /* Found, i->first is f, i->second is ++-- */ }

WBuck
C++17
Vereinfachte dies etwas mehr mit an If statement with initializer
. Auf diese Weise können Sie Ihren Kuchen haben und ihn auch essen.
if ( auto it{ m.find( "key" ) }; it != std::end( m ) )
{
// Use `structured binding` to get the key
// and value.
const auto&[ key, value ] { *it };
// Grab either the key or value stored in the pair.
// The key is stored in the 'first' variable and
// the 'value' is stored in the second.
const auto& mkey{ it->first };
const auto& mvalue{ it->second };
// That or just grab the entire pair pointed
// to by the iterator.
const auto& pair{ *it };
}
else
{
// Key was not found..
}

aJ.
m.find == m.end() // not found
Wenn Sie eine andere API verwenden möchten, suchen Sie go for m.count(c)>0
if (m.count("f")>0)
cout << " is an element of m.\n";
else
cout << " is not an element of m.\n";
Ich denke, du willst map::find
. Ob m.find("f")
entspricht m.end()
, dann wurde der Schlüssel nicht gefunden. Andernfalls gibt find einen Iterator zurück, der auf das gefundene Element zeigt.
Der Fehler liegt daran p.first
ist ein Iterator, der nicht für das Einfügen von Streams funktioniert. Ändern Sie Ihre letzte Zeile in cout << (p.first)->first;
. p
ist ein Paar Iteratoren, p.first
ist ein Iterator, p.first->first
ist die Schlüsselkette.
Eine Karte kann also immer nur ein Element für einen bestimmten Schlüssel haben equal_range
ist nicht sehr nützlich. Es ist für map definiert, weil es für alle assoziativen Container definiert ist, aber es ist viel interessanter für multimap.
10132600cookie-checkSo finden Sie heraus, ob ein bestimmter Schlüssel in einer C++ std::map vorhanden istyes
std::pair<iterator,bool> insert( const value_type& value );
Was ist der Bool, den es zurückgibt? sagt es, ob der Schlüssel bereits vorhanden ist oder nicht?– krithikaGopalakrisnan
28. März 2019 um 7:00 Uhr