Pregunta

Estoy tratando de optimizar mi aplicación reduciendo los viajes redondos a mi base de datos. Como parte de ese esfuerzo, he estado moviendo algunas de las tablas a la memoria, almacenándolas como Boost.multiindex contenedores.

Como efecto secundario de este proceso, he perdido la capacidad de hacer coincidencias de comodines en mis cuerdas. Por ejemplo, cuando la mesa se almacenó en MySQL, podría hacer esto:

SELECT * FROM m_table WHERE myString LIKE "foo%"

Sin embargo, dado que ahora estoy usando un contenedor Boost.MultiIndex con una clave de MyString, parece que he perdido esa habilidad.

Obviamente, puedo usar la función igual_range () para encontrar todas las entradas que coincidan exactamente con una cadena específica:

std::pair< typename T::template index<by_name>::type::iterator,
           typename T::template index<by_name>::type::iterator > p
  = m_table.get<by_name>().equal_range(myString);

while (p.first != p.second )
{
  // do something with the EXACT matching entry
  ++p.first;
}

Pero parece que la única forma de hacer una combinación de comodines es caminar toda la estructura y comparar cada clave con un boost :: regex con boost :: regex_match ().

std::pair< typename T::template index<by_name>::type::iterator,
           typename T::template index<by_name>::type::iterator > p
  = std::make_pair(m_table.get<by_name>().begin(),m_table.get<by_name>().end());

while (p.first != p.second )
{
  boost::regex e(myRegex);
  if ( boost::regex_match(p.first->myString, e ) )
  {
     // Do something with the REGEX matching entry
  }
  ++p.first;
}

¿Hay una mejor manera?

¿Fue útil?

Solución

Bueno, primero no tienes que usar un Boost :: Regex, si el comodín es lo suficientemente simple, puedes escapar rodando tu propio operador unario. Notaría que Boost.regex es una de las pocas parte de la biblioteca que realmente requiere estar vinculada (no solo de encabezado).

En cuanto al problema de caminar toda la estructura, lo siento, pero no hay mucho que uno pueda hacer aquí ... si no conoce las búsquedas en avances.

Si conoce los parámetros que estaría buscando de antemano, entonces puede crear una vista especial del contenedor multiíndexo adecuado para realizar esta tarea con un comparador/hasher dedicado (por ejemplo, uno que solo tiene en cuenta el primero 3 caracteres).

Si esperaba más, proporcione más información sobre el tipo de comodines que desea usar y las circunstancias.

Otros consejos

En su caso específico, puede hacer un Lower_Bound ("Foo") y luego caminar hacia adelante buscando partidos, hasta que presione algo que no coincida o llegue al final del contenedor. Sin embargo, no creo que haya una forma general de hacer esta búsqueda.

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