Поиск подстановочного знака внутри структуры данных Boost.MultiIndex?
-
20-09-2019 - |
Вопрос
Я пытаюсь оптимизировать свое приложение, уменьшая поездку в круглый разговор в мою базу данных. В рамках этих усилий я перемещал некоторые таблицы в память, сохраняя их как 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»), а затем идти вперед в поисках совпадений, пока не нажмете что -то, что не соответствует или не достигнет конца контейнера. Я не думаю, что есть общий способ сделать этот поиск.