2013-01-04 5 views
2

다른 사람들의 코드를 이해하려고 힘듭니다. 누군가가 나를 도와 주면 정말 감사하겠습니다.정렬과 개체 비교. C++

객체 배열이 vpair_list이고이 vpair_list 유형이 vpair 인 경우를 가정 해 보겠습니다. 그래서,이 같은 것입니다 : 내가 그 알고하는 sort() 배열 vpair_list의 각 요소를 비교하고 정렬되어

class vpair 
{ 
public: 
    int vid; 
    int vlabel; 
}; 

bool operator < (const vpair& x, const vpair& y); 

vpair* vpair_list; 
vpair_list = new vpair[25]; 
.. 
sort(vpair_list, vpair_list+j); 

.

오브젝트 vpair에는 두 가지 속성이 있기 때문에 그 정렬 작업 방식을 이해할 수 없습니다.

각 속성 (vidvlabel)을 비교하는 것과 같은 정렬 작업이나 .... 내가 생각한 것은 특정 필드 나 특성 (여기서는 vid 또는 vlabel)을 비교하여 정렬을 수행해야한다고 생각한 것입니다.

그러나이 코드는 그와 관련이 없으며 전체 개체를 비교하는 것처럼 보입니다. 누군가 그게 어떻게 작동하는지 말해 줄 수 있니?

미리 감사드립니다.

+0

정렬은 연산자를 호출하여 수행됩니다. 선언했지만 아직 정의하지 않았습니다. –

+1

그것은'operator <'를 사용합니다, 그러나 구현됩니다 ... – Yuushi

+0

정말 고마워요. 그러나 내가 의미하는 바는 '연산자 <'가 어느 분야인지 비교하는 것입니다. vid 및 vlabel을 모두 비교합니까? 그렇다면 (vpair_list [0] .vid vpair_list [1] .vlabel)은 어떻게됩니까? 어떻게 분류 될 것인가? – WonKook

답변

0

합니까 각 속성 (VID 및 vlabel) 또는 .... 비교와 같은 정렬 작업?

정확히을 원하는대로 정확히 이 발생합니다.

사람들이 언급 한대로 기본적으로 < 연산자는 다양한 정렬 알고리즘에 따라 의 요소를 정렬하는 데 해당 연산자의 오름차순이입니다. 그러나 클래스/구조체에 대한 당신에게 가 그것을 코딩하는 프로그래머 의미를 비교 할 기본 방법.

bool operator < (const vpair& x, const vpair& y); 

이 무엇이며이 없습니다. 프로그래머가 2 vpair 순서를 비교하기 위해 제공 한 함수 정의에 대한 선언 일뿐입니다. 프로그래머는 규칙을 사용하여 궁극적으로는 true 또는 false을 반환합니다. 이것은 정렬하는 데 사용됩니다.

그래서 정확히 정렬 할 방법을 결정할 수 있습니다.

bool operator < (const vpair& x, const vpair& y) 
{ 
    if(x.vid != y.vid) 
     return x.vid<y.vid; 

    return x.vlabel <y.vlabel; 
} 

ID의 오름차순으로 정렬되며, 동일하면 vlabel의 오름차순으로 정렬됩니다.

+0

답장을 보내 주셔서 감사합니다. 건배 ~ – WonKook

+0

@ user1643168 기꺼이 도와 드리겠습니다! –

2

표준 접근 방식 :

class vpair 
{ 
public: 
    int vid; 
    int vlabel; 
}; 

bool operator < (vpair const& x, vpair const& y) 
{ 
    return std::tie(x.vid, x.vlabel) < std::tie(y.vid, y.vlabel); 
} 

은 물론, 운영자가 구성원이 될 수 있습니다 : 기본적으로

class vpair 
{ 
    int vid; 
    int vlabel; 
public: 
    bool operator < (vpair const& y) const 
    { 
     return std::tie(vid, vlabel) < std::tie(y.vid, y.vlabel); 
    } 

}; 
+0

감사합니다. 그래서 그것은 vid와 vlabel을 동시에 비교합니다. 하나가 더 크고 다른 하나는 더 작 으면 어떻게 될까요? – WonKook

+0

첫 번째 튜플 요소가 우선합니다. 'std :: tie (vlabel, vid)'를 사용한다. – sehe

+0

'std :: tie'를 사용하여 사전 적으로 비교할 것이다. 즉 첫 번째 요소 (이 경우'vid')를 비교한다. equal, 두 번째 요소를 비교합니다 (이 경우'vlabel'). – Yuushi

1

정렬,의 operator<와 비교합니다. 당신은 다음처럼 클래스에 대한이 연산자를 구현할 수 있습니다

public: 
bool operator < (const vpair& other) const 
{ 
    return (vid < other.vid); // Uses vid but this can be vlable or something else. 
} 

당신이 사용하고있는 클래스와 operator<에 대한 과부하가없는 경우, 당신은 항상 std::sort의 세번째로 비교 함수에 전달할 수 있습니다 인수 :

bool compare_func(vpair i,vpair j) { return (i.vid < j.vid); } 
sort(vpair_list, vpair_list+j, compare_func); 
+0

Gunther 정말 고마워요. – WonKook

+0

무료 함수 술어를 보여주는 +1 – sehe