TIL 2024/9/11

Sung Joo Lee·2024년 9월 11일

STL Algorithms


  • 반복자에 의해 지정된 요소 집합에 대해 수행되는 알고리즘

  • 매우 다양한 알고리즘이 구현되어 있음

    • find, max , for each , accummulate 등등
  • 알고리즘을 사용하기 위해 함수를 인자로써 제공해야 하는 경우가 존재

  • 함수를 인자로써 제공하는 방법

    • Functor
    • Function pointer
    • Lamda expression ( cpp 11 )

알고리즘과 반복자

  • #include
  • 컨테이너에 따라서 적용할 수 있는 알고리즘이 다름
  • 모든 알고리즘은 반복자를 인자로 필요로 함

반복자의 유효성

  • 반복자가 유효하지 않을 수 있음
  • 예를들어, iterator가 가리키고 있는 요소가 삭제된다면
    • iterator가 유효하지 않아짐

알고리즘 예시 1, find

  • find 알고리즘은 컨테이너 내 어떤 요소가 첫 번째로 나타나는 지점을 찾아줌
  • 해당 지점을 가리키는 반복자를 반환하거나, end()를 반환함
    • end()를 반환하는 경우, 해당 요소가 컨테이너 내에 없다는 뜻
#include <iostream>
#include <vector>
#include <set>
#include <algorithm>

int main() {
	std::vector<int> vec{ 1,2,3,7,4,9,10 };
	std::set<char> mySet{ 'A','B','C','D' };

	auto location = std::find(vec.begin(), vec.end(), 4);//iterator를 반환함
	if (location == vec.end())//찾지 못 함
	{
		std::cout << "Can't find" << std::endl;
	}
	else
	{
		std::cout << "found!" << std::endl;
	}

	std::cout << *location << std::endl;

}
//

find는 return 값이 iterator이다. 포인터 연산 가능하다.

  • find 알고리즘의 사용을 위해서는 요소들을 비교할 수 있어야 함
  • operator== 이 사용되므로, 클래스의 경우 오버로딩이 필요
    • 3을 찾는다고 했을 때 3과 5가 같은 것인지 아닌 것인지 판단을 해야 하기 때문에
    • 오버로딩이 되어있어야만 아래 코드처럼 사용 가능
#include <iostream>
#include <vector>

class Player
{
private:
	std::string name;
	int hp;
	int xp;
public:
	//overloading
};

int main()
{
	std::vector<Player> team{};
	Player p{ "hero",100,12 };

	auto loc = find(team.begin(), team.end(), p);

	if (loc != team.end())
	{
		std::cout << *loc << std::endl;
	}
	return 0;
}

for_each

  • for_each 알고리즘은 컨테이너 내 각 요소를 인자로 함수를 호출

  • 컨테이너의 각 요소를 제곱하는 경우의 예제

  • 함수를 인자로 넘기는 방법

    • functor
    • fuction pointer
    • lamda expression
profile
개발로그

0개의 댓글