Pregunta

Estoy buscando un poco de STL, aumentar, o recipiente similar al uso de la misma manera índices se utilizan en las bases de datos para buscar registros usando una consulta como la siguiente:

select * from table1 where field1 starting with 'X';

o

select * from table1 where field1 like 'X%';

pensé acerca del uso de std :: mapa, pero no puedo porque tengo que buscar para los campos que "comienzan con" un poco de texto, y no los que son "igual a". Además de eso, lo necesito para trabajar en múltiples campos (cada "registro" tiene 6 campos, por ejemplo), por lo que necesitaría un std :: mapa separado para cada uno.

Me podría crear un vector ordenado o lista y utilizar la búsqueda binaria (rompiendo el conjunto de 2 en cada paso por la lectura del elemento de en medio y ver si es más o menos de 'X'), pero me pregunto si hay algunos contenedores ya hecho que podría utilizar sin reinventar la rueda?

¿Fue útil?

Solución

Boost.Multi-Índice le permite administrar con varios índice y se implementa el límite distinto como para std :: set / mapa. Usted tendrá que seleccionar el índice correspondiente al campo y luego hacer como si se tratara de un mapa o un conjunto.

A continuación sigue una función genérica que podría utilizarse para conseguir un par de iteradores, el puño con el primer punto de comenzar con un prefijo dado, la segunda en el primer elemento a partir del siguiente prefijo, es decir, el final de la búsqueda

template <typename SortedAssociateveContainer>
std::pair<typename SortedAssociateveContainer::iterator, 
          typename SortedAssociateveContainer::iterator> 
starts_with(
  SortedAssociateveContainer const& coll, 
  typename SortedAssociateveContainer::key_type const& k)
{
  return make_pair(coll.lower_bound(k), 
                   coll.lower_bound(next_prefix(k));
}

donde

  • next_prefix obtiene el siguiente prefijo usando orden lexicográfico en base al comparador SortedAssociateveContainer (por supuesto, esta función necesita más argumentos para ser completamente genérica, consulte la pregunta ).

El resultado de starts_with se puede utilizar en cualquier algoritmo de rango (ver Boost.Range )

Otros consejos

std::map está bien, o std::set si no hay datos que no sean la cadena. Pase su cadena de prefijo en lower_bound para obtener la primera cadena que ordena en o después de ese punto. A continuación, recorra hacia adelante a través del mapa hasta llegar a la final o encuentra un elemento que no comienza con el prefijo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top