2011-02-06 3 views
1

배경 : 축적하려는 관련 특성에 개체의지도를 저장하는 알고리즘을 작성 중입니다. 이것은 네트워크를 통해 사전 정의 된 경로를 사용하여 네트워크로이 속성을로드하는 계단식 할당 절차입니다. 경로는 네트워크의 출발점에서부터 네트워크를 통과하는 모든 지점까지의 빌드 포워드 경로로 정의됩니다.사용자 지정 엄격한 약한 순서 지정

질문 : 내 계단식 방법에

bool pathLinkComp(const PathLink* lhs, const PathLink* rhs) 
{ 
    return (lhs != rhs) && (lhs->cost < rhs->cost); 
} 

그런 다음 사용자 정의 비교와 맵을 사용하여이를 달성하기 위해 나는 다음과 같은 방법으로 이것을 사용

PathLinkTripsMap myMap(pathLinkComp); 
myMap[pathLinkOfInterest] = 100.0; 
// populate other pathLinksOfInterest with initial values 

while (myMap.size()) 
{ 
    // pop 
    auto firstIterator = myMap.end(); --firstIterator; 
    PathLink* link = firstIterator->first; 
    double trips = firstIterator->second; 
    myMap.erase(firstIterator); 

    // do something with the popped data 

    // move the trips back onto the previous link (unless we are at the end of the path) 
    PathLink* backLink = link->backLink; 
    if (backLink) myMap[backLink] += trips; 
} 

이 문제는 경우 그 엄격한 약한 순서를 사용하면 PathLink 객체 두 개가 동일한 비용을 가지면 인덱싱 목적으로 동일한 객체가됩니다. < 대신에 < = 올바른 동작을 얻지 만이 작업은 std :: map의 비교기가하는 엄격한 약한 순서 지정을 제공하지 않습니다. 강제로 큰 일입니다. 이런 식으로 작동하는 std :: map?

어떻게하면 비교기를 구성하여 엄격한 취약성을 달성하고 별도의 키를 분리하여 유지할 수 있습니까?

답변

1

당신은 (당신의지도 유형이 오른쪽지도 < PathLink의 CONST의 * 두 번>은이 나타 납니까?) 포인터의 값을 사용할 수 있습니다 동일한 비용 항목을 차별화 할 :

bool pathLinkComp(const PathLink* lhs, const PathLink* rhs) { 
    return (lhs->cost < rhs->cost) 
    or (lhs->cost == rhs->cost and std::less<PathLink const*>()(lhs, rhs)); 
} 
+0

language breakdown there ... "대신 <, 다음 ...."을 사용하면 ... strick-weak-ordering을주지 않습니다. –

+0

이것은 적어도'(lhs -> 비용 < rhs-> 비용) || ((lhs-> cost == rhs-> cost) && std :: less () (lhs, rhs))'를 호출합니다. –

+0

@OliCharlesworth : 네, 고마워요. –

2

그것은 당신이 필요로하는 같은 소리 std::multimap. 비 고유 키가 허용됩니다.

덧붙여서 나는 비교기에 (lhs != rhs) 표현이 필요 없다고 생각합니다.

+1

나는 당신이 불필요한 (lhs! = rhs)에 대해 옳다고 생각한다 ... 나는 그것이 => (내가 가장 값 비싼 링크를 원하기 때문에 -) -1, 이전에 begin()을 사용했습니다) –