조건자
-> 알고리즘의 인자로 사용된다.
-> 오름차순 또는 내림차순, 탐색 기준 등 조건을 설정한다.
-> bool타입의 값을 반환하는 함수 포인터, 함수 객체를 사용한다.
조건자 만들기
1
2
3
4
5
6
7
8
9
10
11
12
13
|
// 오름차순
template <typename T>
bool Less(T _Dst, T _Src)
{
return _Dst < _Src;
}
// 내림차순
template <typename T>
bool Greater(T _Dst, _Src)
{
return _Dst > _Src;
}
|
cs |
조건자를 통해서 정렬을 시도하려면 알고리즘 함수가 필요하다.
알고리즘 함수
-> 알고리즘 함수를 사용하기 위해서는 #include <algorithm> 추가가 필요하다.
알고리즘 함수_sort()
1
2
3
4
5
6
7
8
9
10
|
vector<int> vecInt;
vecInt.push_back(3);
vecInt.push_back(2);
vecInt.push_back(4);
vecInt.push_back(1);
sort(begin, end, 조건자 함수);
sort(vecInt.begin(), vecInt.end(), Less<int>);
sort(vecInt.begin(), vecInt.end(), Greater<int>);
|
cs |
그런데 C++에서는 조건자를 제공하는 _functional 이라는 파일이 존재한다.
-> 단, 함수 객체로 제공해준다.
functional 역시 사용을 하기 위해서는 #include <functional> 추가가 필요하다.
1
2
3
4
5
|
sort(vecInt.begin(), vecInt.end(), less<int>());
sort(vecInt.begin(), vecInt.end(), greater<int>());
for (size_t i = 0; i < vecInt.size(); ++i)
cout << vecInt[i] << endl;
|
cs |
알고리즘 함수의 sort는 배열 기반 컨테이너만 사용이 가능하다.(노드 기반은 불가능)
-> 배열도 알고리즘 함수의 sort를 사용할 수 있다.
1
2
3
4
|
int iArr[5] = { 1, 4, 2, 5, 3 };
sort(iArr, iArr + 5, less<int>());
sort(iArr, iArr + 5, Greater<int>);
|
cs |
count_if
-> 원소를 순회하면서 조건자에서 true를 반환하는 원소의 개수를 반환한다.
count_if를 통해 홀수의 개수를 반환
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
template <typename T>
bool OddNum(T _num)
{
if((_num % 2) != 0 )
return true;
return false;
}
void main()
{
// count_if(begin, end, 조건자 함수);
int iCnt = count_if(vecInt.begin(), vecInt.end(), OddNum<int>);
cout << iCnt << endl;
}
|
cs |
for_each
-> 컨테이너의 원소를 순회하면서 단순 조건자를 수행한다.
-> 조건자의 반환 타입이 bool이 아니어도 상관없다.
-> 대표적으로 컨테이너 원소가 동적할당한 주소를 가질 경우 사용한다.(자주 사용함)
일반적인 방식으로 동적할당해제
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
void main()
{
vector<int*> vecPtr;
vecPtr.push_back(new int);
vecPtr.push_back(new int);
vecPtr.push_back(new int);
vecPtr.push_back(new int);
vecPtr.push_back(new int);
for(size_t i = 0; i < vecPtr.size(); ++i)
{
if(vecPtr[i])
{
delete vecPtr[i];
vecPtr[i] = nullptr;
}
}
vecPtr.clear();
}
|
cs |
for_each()를 통한 동적할당해제
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
template <typename T>
void Safe_Delete(T& _Dst)
{
if(_Dst)
{
delete _Dst;
_Dst = nullptr;
}
}
void main()
{
for_each(vecPtr.begin(), vecPtr.end(), Safe_Delete<int*>);
vecPtr.clear();
}
|
cs |
동적할당한 주소를 가진 원소를 삭제 하려고 할 때,
동적할당 해제만 하게되면 컨테이너의 메모리는 남아있으므로 할당 해제 후에 clear()를 통해서
메모리도 같이 삭제 시켜줘야 한다.
'Programming > STL' 카테고리의 다른 글
C++(STL Container) vector의 메모리 정책, 생성자, reserve() (1) | 2020.09.28 |
---|---|
C++(STL Container) 반복자(iterator) (0) | 2020.09.28 |
C++(STL Container) vector (0) | 2020.09.27 |
C++(STL Container) map (0) | 2020.09.27 |
C++(STL Container) list (0) | 2020.09.27 |