• 카테고리

    질문 & 답변
  • 세부 분야

    알고리즘 · 자료구조

  • 해결 여부

    미해결

bool operator< 질문드립니다.

20.02.07 01:10 작성 조회수 2.78k

1

크루스칼에서 bool operator을 작성할떄는

bool operator<( Edge &b){

    return val > b.val;

}

와 같이 했엇는데 

왜 프림에서는 

bool operator<(const Edge &b)const {

    return val > b.val;

}

와같이 작성한건가요??

const 구조체를 받는 이유와

함수뒤에 붙은 const는 어떤의미인지 궁금해요!!

답변 3

·

답변을 작성해보세요.

2

연산자 오버로딩인 operator<  함수는 원래 const 로 만들고, 매개변수도 const 로 받는 것이 바람직합니다.

크루스칼에서 구조체 벡터를 정렬할 때도 const를 사용해 operator< 함수를 만들기 바랍니다.  아무래도 벡터와 sort 함수는 사용자가 많이 사용하는 라이브러리다 보니 보안이 느슨해서 const 를 하지 않아도 에러 없이 작동해서 그렇게 썼던것 같습니다.  바람직하지 않았던 것 같습니다.  우선순위큐 자료구조는 보안이 엄격해 const를 사용하지 않으면 에러가 납니다. 연산자 오버로딩을 할 때는 어떤 자료구조에 사용하건 const 사용을 무조건 하시기 바랍니다.

bool operator<(const Edge &b)const {

    return val > b.val;

}

에서 Edge &b는 구조체를 값으로 받지 않고 주소로 받은 것입니다. 이렇게 하는 이유는 아무래도 구조체는 기본형 변수보다는 덩치가 있어서 값으로 받으면 프로그램 속도가 느려집니다. 그래서 주소로 받아 속도를 높이기 위한 것입니다. 그런데 주소로 받으면 operator< 함수가 구조체의 주소에 접근해 값을 변경할 수 있는 가능성이 있어 보안에 취약해 집니다. 그래서 const Edge &b 처럼 읽기 전용으로 선언해 operator< 가  구조체의 값을 변경하지 못하도록 하는 것입니다.

C++ 클래스에서 함수 헤더 뒷부분에 const를 붙이는 함수를 상수멤버함수라고 합니다. 상수멤버함수는 객체의 멤버변수를 읽기만 하지 값을 변경할 수 없는 함수입니다. 

즉 둘다 보안을 위해 const를 붙이는 것이며,  우선순위큐 자료구조는 연산자 오버로딩 함수가 const로 작성된 것일때만 에러없이 작동을 합니다.

0

시타포르-님의 프로필

시타포르-

2022.08.03

와 검색해서 들어왔는데 설명을 너무 잘해주시네요 감사합니다!

0

devbelly님의 프로필

devbelly

질문자

2020.02.07

감사합니다 ^^