Domanda

Sto cercando di ottimizzare la mia domanda, riducendo di andata e ritorno al mio database. Come parte di questo sforzo, sono stato in movimento alcune delle tabelle in memoria, la loro memorizzazione come Boost.MultiIndex contenitori.

Come effetto collaterale di questo processo, ho perso la capacità di fare di corrispondenza wild-card su mie corde. Per esempio, quando il tavolo è stato memorizzato in MySQL, avrei potuto fare questo:

SELECT * FROM m_table WHERE myString LIKE "foo%"

Tuttavia, dal momento che ora sto usando un contenitore Boost.MultiIndex con una chiave di myString, sembra che ho perso questa capacità.

Ovviamente, posso utilizzare la funzione equal_range () al fine di trovare tutte le voci che corrispondono a una stringa specifica esattamente:

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;
}

Ma sembra che l'unico modo per fare una partita di wild-card è camminare l'intera struttura e confrontare ogni chiave per 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;
}

C'è un modo migliore?

È stato utile?

Soluzione

Bene, per prima cosa non realmente necessario utilizzare un boost :: regex, se il carattere jolly è abbastanza semplice, è possibile ottenere via da dolci si possiede operatore unario. Vorrei far notare che Boost.Regex è uno dei pochi parte della biblioteca che richiede in realtà essere legato (non solo intestazioni).

Per quanto riguarda il problema di camminare tutta la struttura, mi dispiace, ma non c'è molto che si può fare qui ... se non si conoscono le ricerche degli anticipi.

Se si conoscono i parametri che si sarebbe in cerca di in anticipo, quindi è possibile creare una vista speciale del contenitore multi-Index adatto per eseguire questa operazione con un comparatore dedicato / Hasher (per esempio, uno che prende solo in spiegare i primi 3 caratteri).

Se speravate di più, si prega di fornire ulteriori informazioni per quanto riguarda il tipo di caratteri jolly che si desidera utilizzare e le circostanze.

Altri suggerimenti

Nel vostro caso specifico, si può fare un lower_bound ( "foo") e poi a piedi in avanti alla ricerca di corrispondenze, fino a colpire qualcosa che non corrisponde o raggiungere la fine del contenitore. Non credo ci sia un modo generico per fare questo però ricerca.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top