문제

문제가 발생합니다 boost::multi_index_container Random-Access 및 Orderd_unique와 동시에 작업하십시오. (긴 질문에 대해 죄송하지만 예를 사용해야한다고 생각합니다.)

예를 들어, 공장에서 N 객체를 생산하고 싶다고 가정하고 각 개체에 대해 충족해야 할 요구가 있다고 가정합니다 (이 요구는 다중 인덱스 생성시 알려져 있습니다). 글쎄, 내 알고리즘 내에서 나는 다음 수업에서 저장하는 중간 결과를 얻습니다.

class intermediate_result
{
private:
    std::vector<int>   parts;     // which parts are produced
    int                used_time; // how long did it take to produce

    ValueType          max_value; // how much is it worth
};

벡터 parts 객체가 생산되는 Descibes (길이는 N이며, CoreSp Demand -Vector보다 사전 어음이 작습니다!) - 각각의 벡터에 대해 나는 사용 된 _time도 알고 있습니다. 또한 생산 된 객체의 벡터에 대한 값을 얻습니다.

모든 객체를 생성 할 수 없도록 또 다른 제약 조건이 있습니다. 내 알고리즘은 여러 가지를 저장해야합니다. intermediate_result-데이터 구조의 관점. 그리고 여기 boost::multi_index_container 쌍의 쌍 때문에 사용됩니다 parts 그리고 used_time 독특한 것을 설명합니다 intermediate_result (그리고 내 데이터 구조에서 독특해야합니다) 그러나 max_value 내 알고리즘은 항상 필요하기 때문에 고려해야 할 또 다른 색인입니다. intermediate_result 가장 높음 max_value.

그래서 나는 사용하려고 노력했다 boost::multi_index_container ~와 함께 ordered_unique<> 내 "부품 및 used_time-pair"및 ordered_non_unique<> 나를 위해 max_value (다른 intermediate_result-객체는 동일한 값을 가질 수 있습니다).

문제는 : "부품 및 중고 _time-pair"가 더 작고 사용하는 데 필요한 술어입니다. std::lexicographical_compareparts-벡터와 따라서 많은 사람들에게는 매우 느립니다 intermediate_result-사물. 그러나 해결책이있을 것입니다 : 각 물체에 대한 나의 요구는 그다지 높지 않으므로 각각에 보관할 수 있습니다. 가능한 부품 벡터 중간 결과는 그것에 의해 고유하게 used_time.

예를 들어 : 수요 벡터가있는 경우 ( 2 , 3 , 1) 그런 다음 저장하는 데이터 구조가 필요합니다 (2+1)*(3+1)*(1+1)=24 가능한 부품 벡터와 각각의 항목에서 다른 사용 된 _times는 독특해야합니다! (가장 작은 시간을 저장하는 것은 불충분합니다 - 예를 들어 : 추가 제약 조건이 있다면 : 생산을 위해 주어진 시간을 정확히 충족시키는 것)

그러나 어떻게 결합합니까? random_access<>-Index ordered_unique<>-인덱스?
(example11 이것에 대해 나를 도와주지 않았다 ..)

도움이 되었습니까?

해결책 2

(코드 블록을 작성하기 위해 자신의 답변을 사용해야했습니다 - 죄송합니다!)

그만큼 composite_key ~와 함께 used_time 그리고 parts (Kirill V. Lyadvinsky가 제안한 것처럼) 기본적으로 내가 이미 구현 한 것입니다. 나는 parts-벡터.

ureding_demand를 어떻게 든 저장 한 다음 간단한 기능을 작성할 수 있다고 가정 해 봅시다.

int get_index(intermediate_result &input_result) const
{
    int ret_value  = 0;
    int index_part = 1;
    for(int i=0;i<needed_demand.size();++i)
    {
        ret_value  += input_result.get_part(i) * index_part;
        index_part *= (needed_demand.get_part(i) + 1);
    }
}

분명히 이것은 더 효율적으로 구현 될 수 있으며 이것이 필요한 수요에 대한 유일한 인덱스 순서는 아닙니다. 그러나이 기능이 회원 기능으로 존재한다고 가정 해 봅시다. intermediate_result! 예방하기 위해 이와 같은 것을 쓸 수 있습니까? lexicographical_compare ?

indexed_by<
  random_access< >,      
  ordered_unique< 
    composite_key< 
      intermediate_result,
      member<intermediate_result, int, &intermediate_result::used_time>,
      const_mem_fun<intermediate_result,int,&intermediate_result::get_index>
    >
  >
>

이것이 가능하고 가능한 모든 상태에서 멀티 인덱스를 초기화했다면 parts-벡터 (즉, 위의 내 의견에서 데이터 구조에서 24 개의 빈 맵을 밀었을 것입니다), 이것은 주어진에 대한 올바른 항목을 찾습니까? intermediate_result 일정한 시간에 (올바른 색인을 계산 한 후 get_index) ?
나는 이것을 물어봐야한다. random_access<> 인덱스는 ordered_unique<> 인덱스..

하지만 지금까지 귀하의 답변에 감사드립니다 !!

다른 팁

두 지수를 사용하려면 다음을 작성할 수 있습니다.

indexed_by<
  random_access< >,      
  ordered_unique< 
    composite_key< 
      intermediate_result,
      member<intermediate_result, int, &intermediate_result::used_time>,
      member<intermediate_result, std::vector<int>, &intermediate_result::parts>
    >
  >
>

당신은 사용할 수 있습니다 composite_key 비교 used_time 처음에는 그리고 vector 필요한 경우에만. 그 외에도 멤버 기능을 색인으로 사용할 수 있습니다.

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