template <typename T, typename Key>
bool key_exists(const T& container, const Key& key)
{
return (container.find(key) != std::end(container));
}
Natürlich, wenn Sie Ihnen ausgefallenere konnten immer Vorlage aus einer Funktion, die auch nahm eine gefundene Funktion und eine nicht gefunden Funktion, um so etwas bekommen wollten:
template <typename T, typename Key, typename FoundFunction, typename NotFoundFunction>
void find_and_execute(const T& container, const Key& key, FoundFunction found_function, NotFoundFunction not_found_function)
{
auto& it = container.find(key);
if (it != std::end(container))
{
found_function(key, it->second);
}
else
{
not_found_function(key);
}
}
Und verwenden Sie es wie folgt aus :
std::map<int, int> some_map;
find_and_execute(some_map, 1,
[](int key, int value){ std::cout << "key " << key << " found, value: " << value << std::endl; },
[](int key){ std::cout << "key " << key << " not found" << std::endl; });
der Nachteil ist, mit einem guten Namen kommen, „find_and_execute“ ist umständlich, und ich kann nicht mit etwas besser aus der Spitze von meinem Kopf kommen ...
Wenn Sie nur prüfen möchten, ob ein bestimmter Schlüssel existiert, verwenden Sie wahrscheinlich lieber ['map :: count'] (http://www.cplusplus.com/reference/map/map/count/) – tomsmeding
@tomsmeding Es gibt nur einen einzigen Schlüssel in einer std :: map. Also zählt entweder 0 oder 1. Ist einer effizienter als der andere? – goelakash
@goelakash kaum; es ist nur so, dass "count" ein "int" zurückgibt, während "find" einen ganzen Iterator zurückgibt. Sie speichern die Konstruktion des Iterators :) Wenn Sie nachher * den Wert * verwenden wollen, wenn er existiert, verwenden Sie find und speichern Sie das Ergebnis. – tomsmeding