반응형
1. operator<
- 클래스 내부에서 < 기준 정의
- operator<는 말 그대로 클래스(객체)에서 < 연산자를 직접 정의하는 함수이다.
즉, “이 객체가 다른 객체보다 작은가?”를 판단하는 기준을 직접 정하는 함수라고 생각하면 된다. - 애초에 STL에서 정렬(sort)을 실행할 때 '<'으로 비교하기 때문에 '<'을 다시 재정의 한다고 생각하면 된다.
#include <iostream>
#include <string>
using namespace std;
struct Person {
string name;
int age;
// < 연산자 오버로딩
bool operator<(const Person& other) const {
return age < other.age; // 나이 기준 비교
}
};
int main() {
Person a{"Alice", 25};
Person b{"Bob", 30};
cout << (a < b) << endl; // true (25 < 30)
}
2. 람다 함수
- 이름 없는 즉석 함수
- [ ] 안에서 외부 변수 캡처 가능
- 비교 기준을 임시로 바꾸고 싶을 때 편리
#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
using namespace std;
struct Person {
string name;
int age;
};
int main() {
vector<Person> v = {
{"Alice", 30},
{"Bob", 25},
{"Charlie", 30}
};
// 이름 기준 오름차순
sort(v.begin(), v.end(), [](const Person& a, const Person& b) {
return a.name < b.name;
});
cout << "[이름 기준 정렬 결과]\n";
for (auto &p : v)
cout << p.name << ' ' << p.age << '\n';
cout << '\n';
// 나이 기준 내림차순
sort(v.begin(), v.end(), [](const Person& a, const Person& b) {
return a.age > b.age;
});
cout << "[나이 기준(내림차순) 정렬 결과]\n";
for (auto &p : v)
cout << p.name << ' ' << p.age << '\n';
}
3. 일반 함수
- 비교 함수를 별도로 만들어 재사용 가능
- STL에서 요구하는 형태(const T&)를 지키는 게 안전
#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
using namespace std;
struct Person {
string name;
int age;
};
// 커스텀 비교 함수 (나이 기준 오름차순)
bool compareByAge(const Person& a, const Person& b) {
return a.age < b.age; // a가 더 어리면 true
}
int main() {
vector<Person> v = {
{"Alice", 30},
{"Bob", 25},
{"Charlie", 27}
};
// compareByAge 함수를 정렬 기준으로 사용
sort(v.begin(), v.end(), compareByAge);
for (auto &p : v)
cout << p.name << ' ' << p.age << '\n';
}
※ const가 붙는 이유
sort() 같은 STL 알고리즘이 const 참조를 요구할 수 있다.
예를 들어 STL 내부는 원소를 복사하거나 참조할 때 const T&로 접근할 때가 많아서 비교 함수는 읽기만 하는 함수로 만드는게 안전하다.
반응형
'프로그래밍 언어 > C++' 카테고리의 다른 글
| C++ mutable (0) | 2025.11.03 |
|---|---|
| C++ 람다함수 심화편 (0) | 2025.11.03 |
| C++ 람다함수 기본편 (0) | 2025.10.31 |
| C++ struct와 class의 차이 (0) | 2025.10.04 |
| C++ string compare 사용법 (0) | 2025.10.01 |
댓글