저좀 도와주세요.. C구조체 정렬

익명 사용자의 이미지

공부하고 있는 학생인데요...여기 이런거 올려도 될지..

struct process {
int id, gp, sp, sum;
bool operator()(const process &a, const process &b) {
return a.sum < b.sum;
}
}

main()
{
....
....
std::sort(p, p+n, process());
....
....
}

저기서 bool operator 부분 설명좀 해주세요..
무슨 원리 인지.. ?
정렬하는 것은 알겠는데 기준이 어떻게 되는건지..?

다른데 검색해도 명확한 설명이 없네요?

세벌의 이미지

C 아니고 C++에 대한 질문이네요. C++ operator와 에 sort에 대해 구글에서 찾아보셔요.

yielding의 이미지

std::sort 알고리즘은 (대부분의 알고리즘 처럼) key comparison 알고리즘입니다. 그래서, 정렬하고자 하는 sequence의 각 원소를 비교할 수 있는 방법이 있어야 하겠죠. primitive data type은 이미 "<" 가 정의 되어 있죠. 따라서 추가적인 operator를 만들 필요가 없습니다.
그런데 정의하신 process는 사용자가 정의한 타입이므로 이 타입을 비교하기 위해서 이 타입을 정의한 사람이 "<" 를 정의하고 sort 내부에서 각 sequence를 사용자가 정의해준 "<"를 이용하여 비교합니다.

그리고 위의 코드에 문제가 하나 있군요.

struct process {
    int id, gp, sp, sum;
    friend bool operator()(const process &a, const process &b) {
        return a.sum < b.sum;
    }
};

operator <를 class member로 구현할 경우에는 friend keyword가 필요합니다. 아니면 그냥 struct process 밖으로 빼내도 되고요.

c++의 class X 멤버함수의 첫번째 인자는 const X* this가 암묵적으로 들어오므로 위와같이 정의 하시면 operator<(const process* this, const process&a, const process& b)로 컴파일러가 인식합니다. 따라서 binary operator가 아니라고 에러를 만들어 내겠죠.

Life rushes on, we are distracted

익명 사용자의 이미지

이해는 잘못하겠지만...
저기 관련된 것은 무엇을 봐야 할까요?
검색해도 잘 모르겠네여..
아니면 책이라도..

yielding의 이미지

operator overloading은 c++ 문법에 대한 내용이고요.

std::sort는 STL(Standard Template Library)에 관한 이야기 입니다. (최근 표준은 더 이상 STL이라는 말을 사용하지 않겠지만 여하튼 나와있는 책을 기준으로 말하자면 STL에 관한 책을 찾아야 합니다.)

책을 권하기가 만만치 않네요. 한 권만 권해볼께요.

The C++ programming language :
바이블입니다. 이 책은 C++ 문법, STL 그리고 그 이상의 내용을 담고 있습니다. 여러 번 정독해도 계속 새로운 좋은 책.
단점은 좀 길게 집중할 시간이 필요하다는 것.

여담으로, C++는 다른 언어보다 훨씬 더 언어 자체가 공부할 거리가 많습니다. 적당히 수준을 정해서 언어에만 너무 매이지 말고 풀고자하는 문제에 집중해야 좋은 프로그래머가 되는데 도움이 될겁니다.

Life rushes on, we are distracted

익명 사용자의 이미지

정말 감사합니다.
안그래도 STL공부중이었는데..

콕 찝어서 말씀해주시니 감사합니다.
프로그래머의 길은 멀고도 험하네요