Le falta porque nadie lo agregó. Nadie lo agregó porque los contenedores del STL que std
incorporó la biblioteca estaban diseñados para ser mínimos en la interfaz. (Tenga en cuenta que std::string
no provino de la STL de la misma manera).
Si no le importa una sintaxis extraña, puede fingirla:
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)};
}
utilizar:
if (some_set->*contains(some_element)) {
}
Básicamente, puede escribir métodos de extensión para la mayoría de los std
tipos de C ++ utilizando esta técnica.
Tiene mucho más sentido hacer esto:
if (some_set.count(some_element)) {
}
pero me divierte el método del método de extensión.
Lo realmente triste es que escribir un eficiente contains
podría ser más rápido en un multimap
o multiset
, ya que solo tienen que encontrar un elemento, mientras que count
tienen que encontrar cada uno de ellos y contarlos .
Un multiset que contenga mil millones de copias de 7 (ya sabes, en caso de que te quedes sin) puede tener una muy lenta .count(7)
, pero podría tener una muy rápida contains(7)
.
Con el método de extensión anterior, podríamos hacerlo más rápido para este caso usando lower_bound
, comparando end
y luego comparando con el elemento. Sin embargo, hacer eso para un maullido desordenado y ordenado requeriría un SFINAE elegante o sobrecargas específicas del contenedor.
Yakk - Adam Nevraumont
fuente
count()
enfoque es que hace más trabajo del quecountains()
tendría que hacer.contains()
el que devuelve unabool
sería perder información valiosa sobre los que el elemento está en la colección .find()
conserva y devuelve esa información en forma de iterador, por lo que es una mejor opción para una biblioteca genérica como STL. (Sinbool contains()
embargo, eso no quiere decir que no sea muy agradable de tener o incluso necesario)contains(set, element)
función gratuita utilizando la interfaz pública del conjunto. Por tanto, la interfaz del conjunto es funcionalmente completa; agregar un método de conveniencia solo aumenta la interfaz sin habilitar ninguna función adicional, que no es la forma de C ++.