티스토리 뷰
1. < 를 오버로딩 하는 방법
algorithm 헤더에 정의돼 있는 sort() 펑션은 < 로 정렬한다. 즉 < 를 오버로딩 해주면 된다.
struct edge{
int value;
bool operator <(const edge &b) const{
return this->value < b.value;
}
};
위 처럼 하면 edge e가 안의 value값으로 정렬 가능하다.
edge e[100];
e[0].value = 10;
e[1].value = 110;
e[2].value = 150;
e[3].value = 160;
e[4].value = 30;
e[5].value = 40;
e[6].value = 60;
e[7].value = 50;
e[8].value = 40;
e[9].value = 180;
sort(e,e+10);
for(int i = 0;i < 10;i++)
{
std::printf("%d\n",e[i].value);
}
2. sort()의 세번째 인자에 술어(predication)을 지정하는 방법
struct edge{
int value;
};
struct comp{
bool operator()(const edge &lhs, const edge &rhs){
return lhs.value < rhs.value;
}
};
로 ()를 오버로딩 하면 된다. 위 처럼 괄호 연산자를 오버로딩 하면
comp c;
c(a,b); 라고 마치 함수처럼 쓸 수 있다.
sort의 원형을 보면 (공부 하고 싶으면 당장 sort 함수의 원형에 go to 할 것!! 눈으로 보면 이해하기 힘듬)
template<class _RanIt,
class _Pr> inline
void sort(_RanIt _First, _RanIt _Last, _Pr _Pred)
이와 같이 생겼으며 더 자세히 들어가면
template<class _RanIt,
class _Diff,
class _Pr> inline
void _Sort(_RanIt _First, _RanIt _Last, _Diff _Ideal, _Pr _Pred)
로 생겼다. 더 파고 들어가보면 Pred를 계속해서 안으로 넣어주는걸 볼 수 있다. 이번엔 여기서 사용된다.
pair<_RanIt, _RanIt> _Mid =
std::_Unguarded_partition(_First, _Last, _Pred);
이번엔 랜덤 이터레이터의 페어를 리턴하는 _Unguarded_partition으로 Pred를 넘겨준다.
도대체 Pred는 언제 사용 되는 것인가아아아
하나만 더 들어가 보면 답이 나온다.
!_Pred(*_Pfirst, *(_Pfirst - 1))
이런 부분이 있다. Pred는 괄호와 함께 쓰이는 구나,
!_Pred(*_Pfirst, *(_Pfirst - 1)) 가 뭔지는 내가 정의해준 술어에 따라 다르다.
위 프로그램에선 내가 술어를
struct comp{
bool operator()(const edge &lhs, const edge &rhs){
return lhs.value < rhs.value;
}
};
로 지정해 줬기 때문에 rhs.value가 더 크면 _Pred는 참인 것이다.
좀더 정확히 설명하면 사이즈가 작을 땐 인설트 소트를 사이즈가 클 땐 힙소트를 하는데 그냥 대충 Pred를 이런 식으로 사용한 다 식으로만 보면 되겠다.
사용은 다음과 같이 한다
comp c;
edge e[100];
e[0].value = 10;
e[1].value = 110;
e[2].value = 150;
e[3].value = 160;
e[4].value = 30;
e[5].value = 40;
e[6].value = 60;
e[7].value = 50;
e[8].value = 40;
e[9].value = 180;
std::sort(e,e+10,c);
for(int i = 0;i < 10;i++)
{
std::printf("%d\n",e[i].value);
}
std::sort(e,e+10,c); 이 부분을 명시적 생성자 호출인
std::sort(e,e+10,comp()); 로 해줘도 된다. (자바의 new comp()랑 비슷하다고 생각하믄 된다.)
'Development > Algorithm' 카테고리의 다른 글
퀴즈6 해적들의 금화 문제 (1) | 2011.08.04 |
---|---|
퀴즈5 와인 1000개에서 독이 든 와인 찾기. (2) | 2011.08.04 |
퀴즈4 구분이 불가능한 알약 한개씩 먹기. (0) | 2011.08.04 |
퀴즈3 칼질 하기 (2) | 2011.08.04 |
퀴즈2 도화선 2개로 45분 재기. (0) | 2011.08.04 |
퀴즈1 토너먼트 경기 수 맞추기 (0) | 2011.08.04 |
길 찾기 알고리즘에서 방향 꺾는 부분을 if 문줄여서 간결하게 표현하기 (10) | 2011.03.23 |
문자열을 사전 순으로 정렬하기! (0) | 2010.10.04 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
TAG
- kering
- source
- MFC
- AWS
- gcc
- it
- db
- Troubleshooting
- NDK
- 드라이버
- 리눅스
- driver
- winapi
- 음악
- database
- android
- jni
- Cloud
- 안드로이드
- C++
- C
- API
- 프로그래밍
- Quiz
- java
- linux
- jni강좌
- algorithm
- Python
- Visual C++
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
글 보관함