2009-10-06 3 views
2

데이터베이스에 대한 왕복을 줄여 응용 프로그램을 최적화하려고합니다. 그 노력의 일환으로 테이블의 일부를 메모리로 옮겨서 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; 
} 

더 좋은 방법이 있습니까?

+0

나는 MySQL에 익숙하지 않지만, 와일드 카드를 사용하는 문자열과 같이 지나치게 특수한 검색을 수행하면 정규식을 사용한 선형 검색과 다른 것을 할 것이라고 생각하십니까? (나는 그것을 의심한다). 또한이 동작을 감싸는 함수를 만들 수도 있습니다 (예 :'auto search_by_name (boost :: regex e, multi_index_type m_table) {...; return match;}' – alfC

답변

1

음, 우선 boost :: regex를 사용하지 않아도됩니다. 와일드 카드가 충분히 간단하면 단항 연산자를 사용하여 도망 갈 수 있습니다. Boost.Regex는 실제로 링크해야하는 라이브러리의 일부입니다 (헤더 만 사용하는 것은 아님).

전체 구조를 걷는 문제는 미안하지만 여기서 진보를 모르는 경우에는 여기에 할 수있는 사람이 많지 않습니다.

미리 알 수있는 매개 변수를 알고 있다면 전용 비교기/해시 프로그램으로이 작업을 수행하는 데 적합한 다중 색인 컨테이너의 특수보기를 만들 수 있습니다 (예 : 계정에 처음 3 자).

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

1

특정 경우에 일치하지 않거나 컨테이너의 끝에 도달 할 때까지 lower_bound ("foo")를 수행 한 다음 앞으로 검색합니다. 이 조회를 수행하는 일반적인 방법은 없다고 생각합니다.

+1

equal_range는 실제로 한 번에 lower_bound와 upper_bound를 사용하는 것과 같습니다. –

+0

하지만 정확한 "foo"일치를 찾으려하지 않으면 upper \ _bound를 지나가는 "foo"로 시작하는 문자열을 찾고 있습니다. –