Boost Multi-Index를 사용하여 여러 Indecies를 검색하십시오
-
10-07-2019 - |
문제
검색을 어떻게 제한합니까? boost::multi_index
이전 검색의 결과로? 예를 들어 : 다음과 같은 내부 값을 가진 사각형 클래스가 있다고 가정합니다.
class MyRect
{
public:
int width;
int height;
double value;
}
그리고 "주어진 an과 같은 쿼리에 답변하려면 그러한 객체의 데이터 구조가 필요합니다. input_rectangle
- 어떤 개체 MyRect
그 사각형에 포함되어 있고 가장 높은 값이 있습니까? "
다음과 같은 'multi_index'를 사용할 수 있습니다.
struct given_value{};
struct given_width{};
struct given_height{};
typedef multi_index_container<MyRect,
indexed_by<
ordered_non_unique< tag<given_value>,
member<MyRect, double, &MyRect::value>,
ordered_non_unique< tag<given_width>,
member<MyRect, int, &MyRect::width>,
ordered_non_unique< tag<given_height>,
member<MyRect, int, &MyRect::height>, >
>
> MyDataStructure;
typedef MyDataStructure::index<given_width>::type MyDataStructureGivenWidth;
typedef MyDataStructureGivenWidth::iterator WidthIterator;
내 input_rectangle
너비가 있습니다 input_width
나는 다음과 같은 것을 사용할 수 있습니다.
WidthIterator start_iter = data_object.get<given_width>().begin();
WidthIterator end_iter = data_object.get<given_width>().upper_bound(input_width);
그러나 주어진 두 반복자에 의한 Coresp 높이 검색을 어떻게 제한합니까? (그 후 그 결과 그 결과에서 가장 높은 값을 가진 객체를 찾으십니까?)
해결책
나는 당신이 안락한 제한을 할 수 있다고 생각하지 않습니다.
일치하는 폭 쿼리의 결과 반복자를 다른 컨테이너에 저장하고 해당 컨테이너를 사용하여 remove_if와 일치하는 높이를 찾으십시오. 그런 다음 max_element를 사용하여 가장 큰 것을 찾으십시오.
요소를 포인터로 저장하면 동일한 마이크를 사용하여 결과를 저장할 수 있습니다.
다른 팁
문제를 올바르게 이해하면 더 간단한 솔루션이있을 수 있습니다. MyRect를 값으로 주문한 STL 세트에 넣으십시오 (비교 연산자 또는 사용자 정의 비교 함수를 정의해야 함). 귀하는 사용자 정의 술어를 만들 수 있으며 주어진 MyRect가 특정 범위 내에 있는지 확인합니다. 그런 다음 stl-algorithm을 사용합니다 find_if
, 그리고 그것을 관습 술어를 건네주십시오. 순서가 감소하여 순서를 가로 지르는지 확인하면 (예 : reverse_iterator를 사용하여) 찾고있는 Myrect를 반환해야합니다.
그것이 이해할 수 있고 당신의 문제에 적용되기를 바랍니다.