Il n'en a pas parce que personne ne l'a ajouté. Personne n'a ajouté ça parce que les conteneurs de la STL, l' std
bibliothèque intégrées conçues pour être minime dans l'interface. (À noter qu' std::string
ne vient pas de la STL de la même façon).
Si vous n'avez pas l'esprit de drôles de syntaxe, vous pouvez faux:
template<class K>
struct contains_t {
K&& k;
template<class C>
friend bool operator->*( C&& c, contains_t&& ) {
auto range = std::forward<C>(c).equal_range(std::forward<K>(k));
return range.first != range.second;
// faster than:
// return std::forward<C>(c).count( std::forward<K>(k) ) != 0;
// for multi-meows with lots of duplicates
}
};
template<class K>
containts_t<K> contains( K&& k ) {
return {std::forward<K>(k)};
}
utilisation:
if (some_set->*contains(some_element)) {
}
Fondamentalement, vous pouvez écrire des méthodes d'extension pour la plupart C++ std
types à l'aide de cette technique.
Il fait beaucoup plus de sens de faire ça:
if (some_set.count(some_element)) {
}
mais je suis amusé par la méthode d'extension de la méthode.
Vraiment triste, c'est que l'écriture d'un efficace, contains
pourrait être plus rapide sur un multimap
ou multiset
, comme ils ont juste à en trouver un, alors count
a trouver chacun d'eux et de les compter.
Un multiset contenant de 1 milliard de copies de 7 (vous savez, au cas où vous manqueriez) peut avoir une très lente .count(7)
, mais qui peut avoir une très rapide, contains(7)
.
Avec l'extension de la méthode, nous avons pu le rendre plus rapide pour ce cas en utilisant lower_bound
, en comparaison des end
, et en le comparant à l'élément. Faire que pour un non-ordonnée miaou ainsi que d'un ordre miaou aurait besoin de fantaisie SFINAE ou spécifique au conteneur des surcharges.