2013-06-21 2 views
0

잠시 동안 데이터 구조 문제를 숙고했지만 좋은 해결책이 떠오를 것으로 보입니다. 나는 해결책이 간단하다는 느낌을 떨쳐 낼 수 없다. 그러나 나는 단지 그것을 보지 않고있다. 그러나 잘하면 너희들이 도울 수있다!C++의 계층 적 필터링 된 조회

다음과 같은 문제가 있습니다. 메모리에 많은 개체 모음이 있습니다. 각각에는 여러 개의 데이터 필드가 있습니다. ID와 같은 일부 데이터 필드는 각 개체마다 고유하지만 이름과 같은 다른 개체는 여러 개체에 나타날 수 있습니다.

class Object { 
    size_t id; 
    std::string name; 
    Histogram histogram; 
    Type type; 
    ... 
}; 

나는 나를 빨리 (개체의 수는 상대적으로 큰 경우에도, 즉 수백만) 개체 구성원의 임의의 수 동안의 사양 주어진 컬렉션을 필터링 할 수있는 방법으로 이러한 개체를 구성 할 필요가 미 규정으로 남겨진 모든 회원은 와일드 카드로 간주됩니다. 예를 들어 주어진 name을 지정하면 이름 구성원이 주어진 이름과 동일한 모든 개체를 검색하려고합니다. 그러나 쿼리에 히스토그램을 추가하면 쿼리가 namehistogram 필드에서 일치하는 개체 만 반환하도록하고 싶습니다. 따라서, 예를 들어, 나는 두 번째 호출이 반환 곳

retrieve(42, WILDCARD, WILDCARD, WILDCARD) 

뿐만 아니라

retrieve(42, WILDCARD, WILDCARD, Type_foo) 

을 할 수있는 기능을

std::set<Object*> retrieve(size_t, std::string, Histogram, Type) 

싶습니다 적거나 동등하게 많은 첫 번째 개체로 어떤 데이터 구조가 이와 같은 쿼리를 허용하며 수백만의 개체 수에 대해 합리적인 시간에 작성되고 쿼리 될 수 있습니까?

도움 주셔서 감사합니다.

답변

0

먼저 Boost Multi-index을 사용하여 Object의 다른 구성원보다 효율적으로 조회 할 수 있습니다. 이것은 고려해야 할 요소의 수를 제한하는 데 도움이 될 수 있습니다. 두 번째 단계로 λ 식을 사용하여 std::find_if의 술어를 구현하여 첫 번째 요소를 얻거나 std::copy_if을 사용하여 모든 요소를 ​​대상 시퀀스에 복사 할 수 있습니다. 부스트를 사용하기로 결정한 경우 부스트 범위를 filtering과 함께 사용할 수 있습니다.