algorithm

manmarru·2024년 4월 9일

c++

목록 보기
14/24
#include <algorithm>

fill

  • 순회하면서 값을 채운다.
    fill(begin, end, 값);
vector<int> Tmep(3, 1); // 1, 1, 1
fill(Temp.begin(), Temp.end(), 2); //2, 2, 2가 됨

int arr[5]; // 배열도 가능하다.
fill(arr, arr + 5, 3);
  • 내부구현
_EXPORT_STD inline constexpr _Fill_fn fill; // inline으로 치환된다.

class _Fill_fn {
public:
_STATIC_CALL_OPERATOR constexpr _It operator()(_It _First, _Se _Last, const _Ty& _Value)
     /*
     길고 복잡한 코드 생략
     */
     auto _UFirst      = _RANGES _Unwrap_iter<_Se>(_STD move(_First));
     const auto _ULast = _RANGES _Unwrap_sent<_It>(_STD move(_Last));

     for (; _UFirst != _ULast; ++_UFirst) {
         *_UFirst = _Value;
     }

반복문으로 순회하면서 값 채운다.
하지만 이터레이터를 실제 포인터로 바꾸는 효율적인 연산이 구현돼있다.
(_RANGES _Unwrap_iter)

sort

  • 정렬함수
  • sort(정렬 시작 주소, 마지막 주소, 정렬기준)
    세 번째 원소를 넣지 않으면 오름차순 정렬한다.
bool sizesort(string szSrc, string szTmp)
{
	if (size(szSrc) == size(szTmp))
		return szSrc[0] < szTmp[0];
	return size(szSrc) < size(szTmp);
}

int main()
{
	int iNum;
	string szWord[20000];
	cin >> iNum;
	for (int i = 0; i < iNum; ++i)
	{
		cin >> szWord[i];
	}
	sort(szWord, szWord + iNum, sizesort);
	return 0;
}

비교 구조체

표준 라이브러리에 정의돼있는 비교 함수가 정의돼있는 템플릿 구조체가 있다.
greater<타입>

추적해서 들어가보면 템플릿 구조체인데, 비교함수가 내부에 정의돼있어서 sort 에 사용할 수 있다.

vector<int> temp
sort(temp.begin(), temp.end(), greater<int>());

순열 만들기

배열을 넣으면 이전/다음 크기의 순열로 순서를 바꿔준다.
bool prev_permutation(순열의 시작, 끝);
bool next_permutation(순열의 시작, 끝);
다음 순서 순열이 없으면 false 반환

int Temp[3] { 0, 1, 2 };

do
{
	for (int i : Temp)
		cout << i << ' ';
	cout << endl;
} while (next_permutation(Temp, Temp + 3));

원소들을 알아서 정렬해주니까 그걸 출력하기만 하면 된다.

원소 밀기

rotate(_FwdIt _First, _FwdIt _Mid, _FwdIt _Last)

_First: 원소를 가져다 둘 시작점
_Mid: 옮길 원소가 있는 시작점
_Last: 옮길 원소가 있는 마지막
셋 다 이터레이터로 줘야 한다.

_Mid부터 _Last까지의 원소를 _First로 민다.

vector<int> Temp = {1,2,3,4,5};
rotate(Temp.begin(), Temp.begin() + 2, Temp.begin() + 4);
//결과: 3 4 5 1 2

내부적으로 reverse를 세번 사용한다.
1. 첫 번째 구간 뒤집기
2. 두 번째 구간 뒤집기
3. 전체 뒤집기

12345로 시작하는 위의 코드를 예시로 든다면
21345
21543
34512 -> 완성!

0개의 댓글