okaybody5   3년 전

뭐 풀이를 보는데

구조체 내에서 갑자기 자기 구조체를 선언하더니 bool operator를 사용합니다.

거기까진 괜찮았는데... bool operator< 이후에 return에서는 >을 리턴합니다.

struct node {
int idx, cst;
ll dst;
node(int idx, int cst, ll dst) : idx(idx), cst(cst), dst(dst) {} // 여기는 초기화 과정인것을 알겠는데..
bool operator <(node A)const { return dst > A.dst; } // 이부분이 뭘 의미하는지 모르겠습니다.
};

소스는 이거였는데.. 봐도봐도 몰라서 여쭤봅니다.

이것의 의미를 정확하게 가르쳐주실분 호옥시 계십니까? ㅠㅠ 제발..  bool operator뒤에 오는 연산자와 뒤의 return의  연산자가 달라지면 어떻게 되는건가요??

ehddml3   3년 전

우주신과의 교감이라는 문제에서 이런 코드를 썼는데요. 비슷해서 올려봅니다. 요 코드를

priority_queue<edge> q;

이런식으로 쓰게되면 edge에서는 operator < 때문에 자동으로 정렬이 들어가게 됩니다. sort라던지 lower_bound라던지 이런거에서도 똑같이 적용됩니다.

struct edge안에 들어있는 edge부분은 생성해줄때 저렇게 해줍니다.

사용은 이런식으로 했구요. >>>> q.push(edge(i,j,sqrt(pow(gods[i].first-gods[j].first,2)+pow(gods[i].second-gods[j].second,2))));

얘네들이 들어간 걸 while(!q.empty) q.pop(); 이런식으로 돌리면 dist가 작은순부터 주르륵 나오게 됩니다.(pq는 큰값을 맨위로 올리죠. 근데 여기서는 operator가 dist가 클수록 작다를 표현하고 있어요)

캡처.PNG

jwvg0425   3년 전

C++ 의 연산자 오버로딩 문법에 대해 찾아보세용

okaybody5   3년 전

@ehddml3


감사합니다! 그러면, 일단 operator의 리턴부분에서 dist가 더 클떄를 의미하는데, 이것이 operator 뒤의 연산자 부분에서 <, 즉 작다의 의미를 가지고 있으니

클수록 작다가 되는거라고 해석해도 될라나요?

그러면, 이것의 대체방안으로 priority_queue에 원래 값의 음수값을 처리하여 끄낼 때 다시 음의 부호를 붙여줘서 상쇄시키는 방법을 사용해도 되는지 궁금합니다

okaybody5   3년 전

@ehddml3


두번째로 궁금한것은, 클수록 작다랑 작을수록 크다랑 같은 의미이므로 bool operator부분을 

bool operator> (const node A) { return node.dist < A.dist}라고 고치면 왜 에러가 뜨는건가요??

ehddml3   3년 전

네 그렇게 해석하면 될 것 같아요.

저는 pair정도만 써도 되는 정도면 따로 안만들고 그렇게 음수 붙여서합니다.

ehddml3   3년 전

그것은 저도 확실히는 모르겠어요.. 저도 다른 분들 코드 보다가 이런 방법도 있구나해서 본 이후로부터 쓴 것이라..

아마 sort라던지 pq라던지 등의 함수에서 비교할 때 < 를 기준으로  사용하고 있지 않나 싶네용

okaybody5   3년 전

@ehddml3 


감사합니다 많은 도움이 되었습니다!

좋은 팁 하나 얻고 가네요... 감사합니다!

댓글을 작성하려면 로그인해야 합니다.