작성
·
172
답변 2
0
안녕하세요 룰루님ㅎㅎ
cmp에 들어가야 하는 매개변수가 int형 두개니까 그냥 v.begin부터 두개씩 차례대로 할당하는건가요? 조금 더 자세하게 설명 해주시면 감사하겠습니다.
>> cmp 에는 비교하는 2개의 매개변수가 들어갑니다.
어떻게 구현이 될까? 라고 생각해보시면...
sort()를 한번 구현해볼까? 생각해보면 단순합니다.
두개의 요소를 비교하고 그 요소중 큰값이나 작은 값을 왼쪽 혹은 오른쪽에 두는 것.
이것을 반복하는 것이 바로 정렬, sort()입니다.
아주 간단한 버블정렬의 경우 다음과 같습니다.
void bubble(int data[]){
int j = n - 1;
while(j > 1){
for(int i = 0; i < j; i++){
if(data[i] > data[i + 1]){
swap(data[i], data[i + 1]);
}
}
j--;
}
printData(data);
return;
}
지금 보시는것처럼 swap()이 반복되서 일어나면서 정렬이 되죠?
이러한 로직의 중점이 되는 2개의 매개변수 비교를 cmp가 담당하신다고 보시면 됩니다
참고로 sort() 함수는 퀵소트를 기반으로 만들어집니다.
cmp() 함수 자체는 2개의 매개변수 비교 -> true, false를 리턴하는 함수에 불과하고
이 cmp()에서 리턴되는 "해당 매개변수 2개를 기반(i, j)으로 true 또는 false" 값을 기반으로 sort()는 i를 왼쪽에 j를 오른쪽에 놓는 것을 반복해나갑니다.
sort()함수를 자세히 볼까요?
template <class RandomAccessIterator, class Compare> void sort (RandomAccessIterator first, RandomAccessIterator last, Compare comp);
sort()함수는 앞의 코드와 같이 되어있으며 저 3번째 매개변수에는 compare 타입의 함수가 들어가야 되는데 이는 해당 범위에 있는 두 개의 요소를 기반으로 bool타입을 반환하는 이진함수가 들어가야함이 명시되어있습니다.
또 질문 있으시면 언제든지 질문 부탁드립니다.
좋은 수강평과 별점 5점은 제게 큰 힘이 됩니다. :)
감사합니다.
강사 큰돌 올림.
0
안녕하세요, 인프런 AI 인턴입니다.
룰루랄라코딩생활님께서 sort()
함수와 사용자 정의 비교 함수 cmp
의 동작 원리에 대해 질문하셨군요. 룰루랄라코딩생활님의 궁금증을 해소하기 위해 유사한 질문에 대한 기존 답변을 찾아보았습니다.
sort()
함수는 C++의 표준 템플릿 라이브러리(STL)에서 제공하는 알고리즘으로, 컨테이너의 범위를 인자로 받아 정렬합니다. 사용자 정의 비교 함수 cmp
를 sort()
함수의 세 번째 인자로 전달할 수 있으며, 이 때 cmp
함수는 두 개의 인자를 받아서 첫 번째 인자가 두 번째 인자보다 “작을 때” true를 반환하도록 구현해야 합니다. sort()
함수 내에서 반복적으로 cmp
함수를 호출하여 순서를 결정합니다.
룰루랄라코딩생활님의 질문은, sort()
함수가 어떻게 cmp
함수에 인자를 자동으로 전달하는지에 대한 부분으로 이해됩니다. 실제로 sort()
함수는 컨테이너의 각 요소들을 순회하면서 그 요소들을 비교 함수 cmp
에 전달합니다. 예를 들어, 컨테이너에 [3, 1, 4]가 있으면 sort()
함수는 이 요소들을 cmp(3,1)
, cmp(1,4)
, cmp(3,4)
와 같이 cmp
함수로 전달하여 비교 연산을 수행합니다. 비교 함수는 이러한 비교 연산의 결과에 따라 컨테이너의 요소들이 정렬됩니다.
아래 링크에서는 sort()
함수와 사용자 정의 cmp
함수의 사용 예시를 포함하여 좀 더 자세히 설명되어 있으니, 이해에 도움이 될 것으로 기대됩니다.
cmp
함수를 사용하여 오름차순 및 내림차순 정렬을 어떻게 구현하며, 이 함수가 sort()
함수 안에서 어떻게 작동하는지에 대한 설명이 포함되어 있습니다.앞서 설명한 바와 같이, cmp
함수는 sort()
함수로부터 자동으로 인자를 받아 비교 연산을 수행하고, 이를 통해 컨테이너의 요소들이 정렬되는 원리에 기반합니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추기적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.