토이 프로젝트 중인데, 스마트 포인터로 관리하는 객체 리스트를 특정 멤버 변수 기준으로 정렬하려고 합니다.
코드:
#include <iostream>
#include <vector>
#include <memory>
#include <algorithm>
struct Item {
int id;
Item(int i) : id(i) {}
};
int main() {
std::vector<std::unique_ptr<Item>> items;
items.push_back(std::make_unique<Item>(10));
items.push_back(std::make_unique<Item>(5));
std::sort(items.begin(), items.end());
return 0;
}
오류: error: no match for 'operator<' (operand types are 'std::unique_ptr<Item>' and 'std::unique_ptr<Item>')
시도: unique_ptr에 operator< 오버로딩 시도했으나 소유권 문제로 불가능함 확인.
질문: 람다 식을 사용해 내부 포인터의 id 값을 기준으로 정렬하려면 sort 함수를 어떻게 작성해야 합니까?
댓글8
-
빗방울
2026.10.31 04:31
-
빗방울
2026.10.31 10:10
ㄹㅇㅋㅋ 저도 처음엔 왜 안 되나 한참 봤는데
결국 람다가 답이더라고요ㄷㄷ
-
빗방울
2026.10.31 05:05
맞아요 unique_ptr는 그냥 정렬하면 주소값 비교라 답 없더라고요ㅋㅋ
`std::sort(items.begin(), items.end(), [](const auto& a, const auto& b) { return a->id < b->id; });`
이렇게 쓰시면 될듯요.
-
빗방울
2026.10.31 06:13
맞네요ㅋㅋ 람다 안 쓰면 진짜 답 없죠. 저도 처음에 주소값 정렬되는 거 보고 당황했던 기억나네요.
-
빗방울
2026.10.31 07:31
이거 나중에 데이터 많아지면 정렬 비용 생각해서
그냥 포인터 벡터 따로 빼서 정렬하는 방법도 있긴 함ㅋㅋ
일단은 람다가 제일 편하긴 하겠네요.
-
빗방울
2026.10.31 07:50
근데 이거 나중에 정렬 기준 바뀔 일 많으면
따로 비교 함수나 펑터 하나 만들어두는 게 관리하기 편하더라고요ㅋㅋ
람다도 좋지만 코드 길어지면 가독성 훅 떨어짐ㄷㄷ
-
빗방울
2026.10.31 10:24
맞네요ㅋㅋ
비교 로직 길어지면 람다 쓰다가 코드 떡칠돼서 읽기 힘들어지더라고요ㄷㄷ
그냥 펑터로 빼두는 게 나중에 유지보수할 때 훨씬 편한 듯요.
-
빗방울
2026.10.31 08:00
여기서 정렬하다가unique_ptr 소유권 꼬여서 멘붕오는 경우 많죠ㅋㅋ
그냥 람다로 처리하시는 게 제일 깔끔할 것 같네요.
화이팅하세요ㄷㄷ
모든 이야기1455
가벼운 안부부터 깊은 생각까지, 함께 나눠요.
람다 쓰셔서 a->id < b->id 이런 식으로 비교문 넣어주면 바로 해결될듯요ㅋㅋ 저도 예전에 여기서 헤맸는데 은근 헷갈리네요.