Поиск подстановочного знака внутри структуры данных Boost.MultiIndex?

StackOverflow https://stackoverflow.com/questions/1526531

Вопрос

Я пытаюсь оптимизировать свое приложение, уменьшая поездку в круглый разговор в мою базу данных. В рамках этих усилий я перемещал некоторые таблицы в память, сохраняя их как Boost.multiindex контейнеры.

В качестве побочного эффекта этого процесса я потерял способность делать дикие карты на своих струнах. Например, когда таблица хранилась в MySQL, я мог сделать это:

SELECT * FROM m_table WHERE myString LIKE "foo%"

Однако, поскольку я сейчас использую контейнер Boost.MultiIndex с ключом MyString, кажется, что я потерял эту способность.

Очевидно, я могу использовать функцию eval_range (), чтобы найти все записи, которые точно соответствуют конкретной строке:

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

Но это кажется единственным способом провести дикую карту, это пройти всю структуру и сравнить каждый ключ с Boost :: Regex с 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;
}

Есть ли способ лучше?

Это было полезно?

Решение

Что ж, сначала вам на самом деле не нужно использовать Boost :: Regex, если подстановочный знак достаточно прост, вы можете уйти, вытащив вас собственно. Я хотел бы отметить, что Boost.Regex является одной из немногих частью библиотеки, которая действительно требует связи (не только для заголовка).

Что касается проблемы прохождения всей структуры, я извиняюсь, но не так уж много можно сделать здесь ... если вы не знаете поиски в достижениях.

Если вы знаете параметры, которые вы будете искать заранее, то вы можете создать специальное представление о многоиндексном контейнере, подходящем для выполнения этой задачи с помощью специализированного компаратора/Hasher (например, тот, который учитывает только первое 3 символа).

Если вы надеялись больше, предоставьте больше информации о типах подстановки, которые вы хотите использовать, и обстоятельствах.

Другие советы

В вашем конкретном случае вы можете сделать Lower_bound («foo»), а затем идти вперед в поисках совпадений, пока не нажмете что -то, что не соответствует или не достигнет конца контейнера. Я не думаю, что есть общий способ сделать этот поиск.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top