문제

데이터베이스로의 왕복을 줄임으로써 응용 프로그램을 최적화하려고합니다. 그 노력의 일환으로, 나는 일부 테이블을 메모리로 옮기고 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 ()와 부스트 :: 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;
}

더 좋은 방법이 있습니까?

도움이 되었습니까?

해결책

글쎄, 먼저, 당신은 실제로 부스트 :: regex를 사용할 필요가 없습니다. 와일드 카드가 충분히 간단하다면, 당신은 자신의 단제 운영자를 굴려서 도망 갈 수 있습니다. roost.regex는 실제로 헤더 전용이 아닌 링크 해야하는 라이브러리의 몇 안되는 부분 중 하나입니다.

전체 구조를 걷는 문제에 관해서는 미안하지만 여기서 당신을 할 수있는 사람은 많지 않습니다.

사전에 찾고자하는 매개 변수를 알고 있다면 전용 비교기/해셔를 사용 하여이 작업을 수행하는 데 적합한 멀티 인덱스 컨테이너의 특별한보기를 만들 수 있습니다 (예 : 첫 번째를 고려하는 것과 같은 것. 3 자).

더 많은 것을 기대하고 있다면 사용하려는 와일드 카드의 종류와 상황에 대한 자세한 정보를 제공하십시오.

다른 팁

특정한 경우, 컨테이너의 끝에 맞지 않거나 끝나지 않는 것을 때릴 때까지 Lower_Bound ( "foo")를 수행 한 다음 일치를 찾을 수 있습니다. 그래도이 조회를 수행하는 일반적인 방법이 없다고 생각합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top