hayman42   5년 전

c++ 이 편리하긴 하지만 제가 아직 초보고 다루기 어려운 부분들이 있다보니 질문드려요.

c++ 내장 자료구조인 priority queue 의 정렬 기준을 제가 정해서 쓰고 싶은데 어찌 쓸 수 있나요?

구글링 해보니 greater less 도 있고 연산자를 정의하는 방법도 있던데 이 방법으론 제가 원하는 기능이 안나오네요.

제가 원하는 기능은 어떤 배열 arr[100] 이 있다 하면 이 값들을 기준으로 인덱스들을 priority queue 에 저장하고 싶습니다.

pair 를 써도 될거 같긴 한데 그러면 메모리를 두배로 먹으니 딱히 쓰고싶지 않아서요..

또 추가 적인 질문으론 연산자를 정의한다는게 무슨 뜻인가요? < 라는 연산자를 뭐 bool operator< 로 시작하는 함수를 만들어서 정의를 하던데..

연산자 정의를 했다고 a < b 라는 연산이 있다고 치면 결과값이 완전히 달라지는 것은 아닐테니까요.

djm03178   5년 전

이런 것을 원하시는 건가요?

hayman42   5년 전

정말 올려주신 코드로 하면 되네요. operator< 로 하면 구조체에 대해서만 가능하던데 위와같이 하면 그냥 되는 이유는 뭔가요?

operator< 랑 operator() 의 차이가 궁금하고 또 굳이 구조체에 왜 넣는건지도 궁금하네요 ㅠㅠ

제가 c++ 의 객체지향에 대해 이해가 부족한 상태인데 이런 것들은 지금 아는 것은 너무 이른건가요?

djm03178   5년 전

저도 C++을 잘 모르고 문제 풀기 위해 필요한 테크닉들만 조금 아는 정도입니다.

operator<는 this 객체가 필요한 거라 원시 타입인 int에 대해서는 그냥 적용할 수 없고, 비교 연산을 처리해주는 구조체의 operator()를 정의해서 2개의 인자를 받아야 합니다.

사실 저는 이렇게 하기보다는 그냥 인덱스를 같이 저장하는 구조체를 만들기를 선호합니다. 외부의 값에 대해 간섭하는 건 그다지 객체지향스럽지도 않고, 코드가 꼬일 가능성도 있고요.

hayman42   5년 전

인덱스를 같이 저장하신다는건 pair 처럼 값이랑 인덱스랑 같이 저장되어있는 자료구조를 이용하신다는 말씀이신가요?

djm03178   5년 전

사실 굳이 인덱스를 저장하는 priority_queue를 써야 할 필요를 잘 모르겠습니다. 그냥 정렬하고 순서대로 접근하면 안 되나요?

인덱스를 굳이 저장하는 건 노드 번호를 기억해야 할 때 정도밖에 겪어보지 못해서, 그런 경우라면 처음부터 구조체 내에 다 넣어놓고 하나의 속성으로서 사용하는 게 개인적으로는 좋아 보입니다.

hayman42   5년 전

https://www.acmicpc.net/proble... 이 문제를 풀고 있었는데 순서가 정해진 상태여서 노드 번호(순서)를 기억해야 하고 값들은 단순히 참조에만 필요하지 값들 자체를 정렬할 필요는 없다고 생각해서 위와 같은 기능을 원했습니다. 물론 제 풀이가 맞는지도 사실 모르겠지만.. 그래도 알아놓으면 좋은 기능이라고 생각해서요. 또 말씀하신대로 구조체에 넣어놓고 쓰면 인덱스만 저장하는 것보단 메모리 사용량이 더 많아져서 조금이라도 더 좋은 기능을 원했는데, 사실 그렇다고 사용량이 무척 줄어드는것도 아니고 편의성까지 생각하면 말씀하신 방법도 좋다고 생각합니다.

djm03178   5년 전

어떤 방법을 생각하셨는지는 모르겠지만, 해당 문제의 경우 저는 인덱스는 고려하지 않고 값만을 우선순위 큐에 넣어서 풀었습니다.

hayman42   5년 전

음.. 생각해보겠습니다 감사합니다

zlzmsrhak   5년 전

함수 선언이 귀찮거나 코드가 더러워진다고 느껴진다면 아래처럼도 쓸 수 있습니다.

hayman42   5년 전

감사합니다.

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