인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

devbelly님의 프로필 이미지
devbelly

작성한 질문수

it 취업을 위한 알고리즘 문제풀이 입문 (with C/C++) : 코딩테스트 대비

79. 원더랜드 : Prim MST(최소스패닝트리) 알고리즘 : priority_queue 활용

bool operator< 질문드립니다.

작성

·

3.2K

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

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

0

devbelly님의 프로필 이미지
devbelly
질문자

감사합니다 ^^

devbelly님의 프로필 이미지
devbelly

작성한 질문수

질문하기