[C++ 표준] STL 알고리즘
카테고리: STL
인프런에 있는 홍정모 교수님의 홍정모의 따라 하며 배우는 C++ 강의를 듣고 정리한 필기입니다. 😀
🌜 [홍정모의 따라 하며 배우는 C++]강의 들으러 가기!
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이 추가된다.
- 반복자 itr가 컨테이너에서 3을 찾아 3이 있는 위치를 가리키게 됨.
- 사용자 객체 타입으로 컨테이너에 넣었을 땐 같다 아니다를 판별할 기준이 있어야하므로 연산자 오버로딩 꼭 해주기
- find가 찾으려는 값이
==
맞는지 판별할 기준이 있어야 하니까.
- 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
이 바로 마지막 원소를 가리키는 반복자!
- a 반복자로부터 'b 반복자 전까지'를 정렬 [a, b)
sort(container.begin(), container.end());
📢 list 자료구조에서 사용할 때 주의 사항
- list 는
sort
와reverse
함수를 자체로 가지고 있다.- 본인 것을 써야 한다.
list<int> li;
일 떄- STL 알고리즘의
sort
를 사용하여 정렬하면 에러 발생sort(container.begin(), container.end());
❌
- 본인의
sort
를 쓸 때li.sort()
⭕ 이렇게 자기 것을 써야 한다.
- STL 알고리즘의
- 본인 것을 써야 한다.
#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() // ⭕
}
- vector는
insert
가 느릴 수 있다. - 모든 케이스에서 그런 것은 아니지만 list가 vector보다
insert
는 더 빠른 편이다.
🌜 개인 공부 기록용 블로그입니다. 오류나 틀린 부분이 있을 경우
언제든지 댓글 혹은 메일로 지적해주시면 감사하겠습니다! 😄
댓글 남기기