Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

C++에서 구조체를 특정 기준으로 정렬하는 방법

C++에서는 구조체(structure)의 멤버 변수를 기준으로 데이터를 손쉽게 정렬할 수 있습니다. 이번 글에서는 book이라는 구조체를 예로 들어, 책의 가격(price)을 기준으로 배열을 오름차순으로 정렬하는 방법을 알아보겠습니다.

예제에서 사용할 book 구조체는 책 제목(title), 페이지 수(pages), 가격(price) 세 가지 멤버 변수를 가집니다.

비교 함수(Comparator) 작성하기

구조체 두 개를 비교하려면 비교 전용 함수를 직접 정의해야 합니다. 이 함수는 두 구조체를 인자로 받아 원하는 기준에 따라 true 또는 false를 반환합니다. 여기서는 첫 번째 책의 가격이 두 번째 책보다 낮으면 true를 반환하도록 작성했습니다.

이렇게 만든 비교 함수는 표준 라이브러리의 sort() 함수에 세 번째 인자로 전달되어 정렬 기준으로 사용됩니다.

전체 예제 코드

#include <iostream>
#include<algorithm>
using namespace std;
struct book {
    string title;
    int pages;
    float price;
};
bool compareBook(book b1, book b2) {
    if(b1.price < b2.price) {
        return true;
    } return false;
}
main() {
    book book_arr[5];
    book_arr[0].title = "C Programming";
    book_arr[0].pages = 260;
    book_arr[0].price = 450;
    book_arr[1].title = "DBMS Guide";
    book_arr[1].pages = 850;
    book_arr[1].price = 775;
    book_arr[2].title = "Learn C++";
    book_arr[2].pages = 350;
    book_arr[2].price = 520;
    book_arr[3].title = "Data Structures";
    book_arr[3].pages = 380;
    book_arr[3].price = 430;
    book_arr[4].title = "Learn Python";
    book_arr[4].pages = 500;
    book_arr[4].price = 300;
    sort(book_arr, book_arr + 5, compareBook);
    for(int i = 0; i<5; i++) {
        cout << book_arr[i].title << "\t\t" << book_arr[i].pages << "\t\t" <<
            book_arr[i].price << endl;
    }
}

실행 결과

Learn Python 500 300
Data Structures 380 430
C Programming 260 450
Learn C++ 350 520
DBMS Guide 850 775

코드 설명

실행 결과를 보면 책들이 가격이 낮은 순서대로(300 → 775) 정렬된 것을 확인할 수 있습니다. 핵심 동작 과정은 다음과 같습니다.

  • compareBook 함수: 두 구조체의 price 멤버를 비교하여 앞의 값이 작으면 true를 반환함으로써 오름차순 정렬을 유도합니다.
  • sort() 호출: 배열의 시작 주소와 끝 주소, 그리고 비교 함수를 함께 전달하여 std::sort가 compareBook의 기준대로 요소들을 재배치합니다.

만약 내림차순으로 정렬하고 싶다면 조건문에서 부등호 방향만 반대로 바꾸면 됩니다. 또한 페이지 수나 제목 등 다른 멤버 변수를 기준으로 정렬하고 싶을 때도 비교 함수 내부의 비교 대상만 변경하면 되므로 매우 유연하게 활용할 수 있습니다.