2013-10-18 2 views
0

다른 매개 변수 (ID 및 흐름)별로 정렬에 액세스하려면 TVertex 객체 그룹이 필요합니다. O (1) 시간에 k 번째 요소를 찾고 o (log2 (N)) 시간에 해당 속성을 업데이트합니다.포인터 집합을 업데이트하는 방법 C++?

이렇게하려면 TComparatorF 및 TComparatorI 클래스를 사용합니다.

그들은 모두 TVertex 및 운영자에 대한 포인터를 가지고>과 TComparatorF는 비교 <

)는 TComparatorI은 IDS

TVertex을 (비교

흐름 비교기 자체에의 포인터를 둔다. 그런 다음 비교기를 비교기 세트에 배치합니다.

그러나 TVertex 객체의 속성을 업데이트하면 비교 자의 위치가 변경되지 않습니다.

내 세트를 강제 업데이트하거나 여러 정렬을 저장하는 더 좋은 방법이 있습니까?

코드 :

#include<stdio.h> 
#include<set> 
#include<stdlib.h> 
using namespace std; 
const int N=300000; 

struct TVertex; 
struct TComparatorF 
{ 
    TVertex *cmp; 
    bool operator >(const TComparatorF &other) const; 
    bool operator <(const TComparatorF &other) const; 
}; 
struct TComparatorI 
{ 
    TVertex *cmp; 
    bool operator >(const TComparatorI &other) const; 
    bool operator <(const TComparatorI &other) const; 
}; 
set <TComparatorF> flowset; 
set <TComparatorI> idset; 
struct TVertex 
{ 
    int flow,id; 
    TVertex(); 
}; 
bool TComparatorF::operator >(const TComparatorF &other) const 
{ 
    return !(*cmp).flow>(*(other.cmp)).flow; 
} 
bool TComparatorF::operator <(const TComparatorF &other) const 
{ 
    return !(*cmp).flow<(*(other.cmp)).flow; 
} 
bool TComparatorI::operator >(const TComparatorI &other) const 
{ 
    return !(*cmp).id>(*(other.cmp)).id; 
} 
bool TComparatorI::operator <(const TComparatorI &other) const 
{ 
    return !(*cmp).id<(*(other.cmp)).id; 
} 
TVertex::TVertex() 
{ 
    flow=0; 
    TComparatorF comp; 
    comp.cmp=this;  
    flowset.insert(comp); 
    TComparatorI comp2; 
    comp2.cmp=this; 
    idset.insert(comp2); 
} 
TVertex ver[N]; 

int main() 
{ 
    ver[0].flow=17; 
    ver[0].id=6; 
    ver[1].flow=100; 
    ver[1].id=5; 
    ver[2].flow=5798; 
    ver[2].id=40; 
    TComparatorF comp=*(flowset.begin()); 
    TComparatorI comp2=*(idset.begin()); 
    printf("%d %d\n",(*(comp.cmp)).flow,(*(comp2.cmp)).id); 
    system("PAUSE"); 
    return 0; 
} 

내가 할

17 6 ​​

대신

5798 40

답변

1

"세트를 강제 업데이트하거나 여러 정렬을 저장하는 더 좋은 방법이 있습니까?"라는 질문에 대한 대답.

컨테이너는 항목 변경시 자체를 업데이트하지 않으므로 설정 항목과 맵 키는 일정합니다. 업데이트가 수동으로 수행되는 (제거/삽입) 세트를 래퍼로 만들거나 이미 이것을 가지고있는 multi index containers을 사용할 수 있습니다 (modifiers 참조)

+0

그래, 대부분의 컨테스트에 감사드립니다. 외부 라이브러리를 사용할 기회가 없습니다. – user2136963

+0

래퍼의 경우 변수가 변경된 것을 알 수있는 이벤트 시스템없이 만들 수 있습니까? – user2136963

+0

랩퍼에서 랩퍼를 통해서만 이벤트에 액세스 할 수 있으므로 변경시기를 알 수 있습니다. – stefaanv