조건자

-> 알고리즘의 인자로 사용된다.

-> 오름차순 또는 내림차순, 탐색 기준 등 조건을 설정한다.

-> 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(beginend, 조건자 함수);
 
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= { 14253 };
 
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

+ Recent posts