It won't hurt to try

[C++/윈도우프로그래밍응용]26. STL 알고리즘과 람다식 본문

C++/윈도우프로그래밍응용

[C++/윈도우프로그래밍응용]26. STL 알고리즘과 람다식

yongki.doki 2021. 11. 6. 00:32

STL 알고리즘과 람다식

STL 알고리즘

STL 알고리즘

템플릿 기반의 일반적인 알고리즘 모음

  • 탐색(searching), 정렬(sorting), 개수세기(counting)등의 일반적인 알고리즘을 모아둔 것
  • 모든 컨테이너에 대하여 같은 방식으로 동작
      → 템플릿을 사용한 일반화 프로그래밍
  • 반복자를 사용하여 컨테이너에 접근
      → 반복자는 알고리즘과 컨테이너를 연결하는 역할
  • <algorithm> 헤터 파일을 포함

STL 알고리즘의 종류

불변경 알고리즘

  • 컨테이너가 변경되지 않는 알고리즘
  • 개수 알고리즘, 탐색 알고리즘, 비교 알고리즘
알고리즘 분류 알고리즘 설명
개수 count() 값과 일치하는 요소의 개수를 셈
count_if() 조건에 맞는 요소 개수를 셈
탐색 search() 값과 일치하는 첫 번째 요소 반환
find() 값과 일치하는 첫번째 요소 반환
binary_search() 정렬된 컨테이너에 대한 이진 탐색 수행
비교 equal() 두 요소가 같은지 비교
mismatch() 컨테이너 비교 후 불일치 첫번째 요소 반환
lexicographical_compare() 두 순차 컨테이너 비교 후 사전적으로 작은 컨테이너를 반환

변경 알고리즘

  • 컨테이너가 변경되는 알고리즘
  • 초기화 알고리즘, 변경 알고리즘, 복사 알고리즘, 삭제 알고리즘, 대치 알고리즘, 정렬 알고리즘, 분할 알고리즘 등
알고리즘 분류 알고리즘 설명
초기화 fill() 지정 범위 모든 요소를 지정 값으로 채움
generate() 지정 함수의 반환값을 할당
변경 for_each() 지정 범위 모든 요소에 대하여 연산 수행
transform() 지정 범위 모든 요소에 대하여 함수 적용
복사 copy() 하나의 구간을 다른 구간으로 복사
삭제 remove() 지정 구간에서 지정 값을 가진 요소 삭제
unique() 구간에서 중복 요소를 삭제
대치 replace() 지정 구간에서 요소가 지정 값과 일치하면 대치값으로 변경
정렬 sort() 지정된 정렬 기준에 따라 구간 요소 정렬
분할 partition() 지정 구간 요소를 조건에 따라 두 개의 집합으로 나눔

많이 사용되는 알고리즘

binary_search() 함수

이진 탐색을 수행하는 알고리즘

// 비교 함수 정의
bool comp(int n1, int n2) {return n1==n2;}

// main 함수의 내부
vector<int> v = {2,3,5,8,13,19,21};
bool isFound = false;

isFound = binary_search(v.begin(), v.end(), 19, comp);
if(isFound){
  cout << 19 << "발견" << endl;
}

sort() 함수

이진 탐색을 수행하는 알고리즘

// 비교 함수 정의
bool comp(int n1, int n2) {return n1>n2;}

// main 함수의 내부
vector<int> v = {11,15,9,2,8,5,27};
sort(v.begin(), v.end(), comp);

for(auto & n : v)
  cout << n endl;

람다식

람다식(Lambda Expression)

나중에 실행될 목적으로 다른 곳에 전달될 수 있는 함수 객체

  • "이름이 없는 함수"
  • 함수가 필요한 곳에 간단하게 함수를 보낼 수 있음
      → 사용이 간결함
  • 함수가 1회성으로 사용되며, 함수 길이가 짧을 때 유용
  • 함수형 프로그래밍 언어의 패러다임을 위한 개념

람다식의 정의

람다식의 정의 형식

[] (매개변수1, 배개변수2, ...) 반환형 {함수의 내용;}

예) 매개변수x,y를 전달받아 x+y 계산 후 반환하는 함수

[] (int x, int y) {return x+y;}
#include <iostream>
using namespace std;

int main(){

  auto sum = [](int x, int y) {return x+y;}
  cout << sum(11,47) << endl;
  cout << sum(11,78) << endl;
  
  return 0;
}

sort함수에서 사용되는 비교함수를 람다식으로 구성할 수 있다.

// main 함수의 내부
vector<int> v = {11,15,9,2,8,5,27};
sort(v.begin(), v.end(), [](int n1, int n2) {return n1>n2;});

for(auto & n : v)
  cout << n endl;
300x250
300x250
Comments