데이터베이스에 대한 왕복을 줄여 응용 프로그램을 최적화하려고합니다. 그 노력의 일환으로 테이블의 일부를 메모리로 옮겨서 Boost.MultiIndex 컨테이너로 저장했습니다.Boost.MultiIndex 데이터 구조에서 와일드 카드 검색?
이 프로세스의 부작용으로 나는 문자열에서 와일드 카드 일치를 수행 할 수있는 기능을 잃어 버렸습니다. 테이블이 MySQL의에 저장된 예를 들어, 내가이 작업을 수행 할 수 있습니다 :
SELECT * FROM m_table WHERE myString LIKE "foo%"
을하지만, 지금부터 MyString의 핵심으로 Boost.MultiIndex 컨테이너를 사용하고 있기 때문에, 내가 그 능력을 잃은 것 같다 .
분명히, 나는 정확히 특정 문자열과 일치하는 모든 항목을 찾기 위해 equal_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_match()를 사용하여 boost : regex와 비교하십시오.
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;
}
더 좋은 방법이 있습니까?
나는 MySQL에 익숙하지 않지만, 와일드 카드를 사용하는 문자열과 같이 지나치게 특수한 검색을 수행하면 정규식을 사용한 선형 검색과 다른 것을 할 것이라고 생각하십니까? (나는 그것을 의심한다). 또한이 동작을 감싸는 함수를 만들 수도 있습니다 (예 :'auto search_by_name (boost :: regex e, multi_index_type m_table) {...; return match;}' – alfC