저좀 도와주세요.. 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공부중이었는데..

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

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.