Pergunta

Estou tentando otimizar meu aplicativo reduzindo as viagens de ida e volta ao meu banco de dados. Como parte desse esforço, tenho movido algumas das mesas para a memória, armazenando -as como Boost.multiIndex recipientes.

Como efeito colateral desse processo, perdi a capacidade de fazer correspondência de curingas nas minhas cordas. Por exemplo, quando a tabela foi armazenada no MySQL, eu poderia fazer isso:

SELECT * FROM m_table WHERE myString LIKE "foo%"

No entanto, como agora estou usando um contêiner do Boost.MultiIndex com uma chave de mystring, parece que perdi essa habilidade.

Obviamente, posso usar a função Equal_Range () para encontrar todas as entradas que correspondam exatamente a uma string 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;
}

Mas parece que a única maneira de fazer uma partida de curingas é acompanhar toda a estrutura e comparar cada chave para um impulso :: regex com 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;
}

Existe uma maneira melhor?

Foi útil?

Solução

Bem, primeiro você não precisa usar um impulso :: regex, se o curinga for simples o suficiente, você pode fugir ao rolar seu próprio operador unário. Eu observaria que o boost.Regex é uma das poucas parte da biblioteca que realmente exige ser vinculada (não apenas cabeçalho).

Quanto ao problema de caminhar por toda a estrutura, sinto muito, mas não há muito que você possa fazer aqui ... se você não conhece as pesquisas nos avanços.

Se você conhece os parâmetros que procuraria com antecedência, poderá criar uma visão especial do contêiner com vários índices adequado para executar essa tarefa com um comparador/hash dedicado (por exemplo, um que leva em consideração o primeiro primeiro 3 caracteres).

Se você esperava mais, forneça mais informações sobre o tipo de curinga que deseja usar e as circunstâncias.

Outras dicas

No seu caso específico, você pode fazer um Lower_bound ("Foo") e, em seguida, caminhar para a frente procurando por correspondências, até que você acerte algo que não corresponde ou chegue ao final do contêiner. Eu não acho que exista uma maneira geral de fazer essa pesquisa.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top