[C++ 표준] STL 알고리즘

Date:     Updated:

카테고리:

태그:

인프런에 있는 홍정모 교수님의 홍정모의 따라 하며 배우는 C++ 강의를 듣고 정리한 필기입니다. 😀
🌜 [홍정모의 따라 하며 배우는 C++]강의 들으러 가기!


Cpp Reference

위키 백과 표준 템플릿 라이브러리

STL 알고리즘

#include <algorithm> 에서 지원하는 몇 가지 알고리즘 연산들 소개!

min_element

  • 컨테이너 해당 범위의 가장 작은 원소의 반복자를 리턴한다.
  • 컨테이너의 시작위치, 끝위치의 반복자들을 인수로 넘겨 줌 (범위 지정)
  • begin 부터 end가 되기전까지의 범위 [ begin, end ) 중에서의 최소 값의 반복자
#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int main()
{
	vector<int> container;

	for (int i = 0; i < 10; ++i)
		container.push_back(i);

	auto itr = min_element(container.begin(), container.end());
	cout << *itr << endl;
}


max_element

  • 컨테이너 해당 범위의 가장 큰 원소의 반복자를 리턴한다.
  • 컨테이너의 시작위치, 끝위치의 반복자들을 인수로 넘겨 줌 (범위 지정)
  • begin 부터 end가 되기전까지의 범위 [ begin, end ) 중에서의 최대 값의 반복자
#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int main()
{
	vector<int> container;

	for (int i = 0; i < 10; ++i)
		container.push_back(i);

	auto itr = max_element(container.begin(), container.end());
	cout << *itr << endl;
}


find

  • 컨테이너 해당 범위에서 해당 아이템을 검색하여 찾고 그의 반복자를 리턴
  • auto itr = find(container.begin(), container.end(), 3);
    • 반복자 itr가 컨테이너에서 3을 찾아 3이 있는 위치를 가리키게 됨.
      • container.insert(itr, 128); 해주면 3의 위치에 128이 추가된다.
  • 사용자 객체 타입으로 컨테이너에 넣었을 땐 같다 아니다를 판별할 기준이 있어야하므로 연산자 오버로딩 꼭 해주기
    • find가 찾으려는 값이 == 맞는지 판별할 기준이 있어야 하니까.
  • 못찾으면 끝 반복자 end() 리턴
    • 항상 end()을 리턴하는건 아니고 파라미터로 넘긴 “범위의 끝”을 리턴한다.
      • 예를 들어 find(a.begin() + 3, a.begin() + 6, “Hello”) 이렇게 호출했다면, a[3], a[4], a[5] 가 모두 “Hello”가 아닐시 a.begin() + 6 을 리턴한다.
#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int main()
{
	vector<int> container;

	for (int i = 0; i < 10; ++i)
		container.push_back(i);

	auto itr = find(container.begin(), container.end(), 3); 
	container.insert(itr, 128);
}


sort

  • 컨테이너의 해당 범위를 정렬 시켜 준다.
  • 세 번째 인수로 정렬 기준이 되는 사용자 정의 비교 함수 포인터를 넘길 수도 있다.
    • 디폴트로는 오름차순 정렬
    • 사용자 정의 클래스의 객체를 담은 컨테이너를 정렬시키려면 그에 맞는 비교 함수를 구현하여 포인터로 같이 넘겨주어야 함
  • 반복자를 인수로 받는다.
    • sort(a, b)
      • a 반복자로부터 'b 반복자 전까지'를 정렬 [a, b)
        • b 반복자가 가리키는 곳은 정렬에 포함되지 않음.
        • 참고로 end()은 마지막 원소를 가리키는 반복자가 아닌 마지막 원소보다도 더 뒤인, 아무 것도 없는 공간을 가리킨다. end() - 1이 바로 마지막 원소를 가리키는 반복자!
sort(container.begin(), container.end());


📢 list 자료구조에서 사용할 때 주의 사항

  • list 는 sortreverse 함수를 자체로 가지고 있다.
    • 본인 것을 써야 한다.
      • list<int> li; 일 떄
        • STL 알고리즘의 sort를 사용하여 정렬하면 에러 발생
          • sort(container.begin(), container.end());
        • 본인의 sort를 쓸 때
          • li.sort()⭕ 이렇게 자기 것을 써야 한다.
#include <iostream>
#include <list>
#include <algorithm>

using namespace std;

int main()
{
	list<int> li;

	for (int i = 0; i < 10; ++i)
		container.push_back(i);

	sort(container.begin(), container.end());  // ❌ 에러발생!
	li.sort()  // ⭕
}
  • vectorinsert가 느릴 수 있다.
  • 모든 케이스에서 그런 것은 아니지만 list가 vector보다 insert 는 더 빠른 편이다.


🌜 개인 공부 기록용 블로그입니다. 오류나 틀린 부분이 있을 경우 
언제든지 댓글 혹은 메일로 지적해주시면 감사하겠습니다! 😄

맨 위로 이동하기

STL 카테고리 내 다른 글 보러가기

댓글 남기기