[programming language]
- oop: object oriented programming
class를 사용한 객체 프로그래밍
모델링하고자 하는 대상을 하나의 자료형으로 표현
- gpl: generic programming language
stl를 사용한 프로그래밍
- fpl: function programming language
마지막에 배웠던 concept이 fpl중 하나
[special function]
- 기본 생성자
- 소멸자
- 복사 생성자
- 복사 대입 연산자
- 이동 생성자
- 복사 할당 연산자
[RAII]
래핑 클래스를 만들고 생성자로부터 자원을 받아와서 사용
자원은 래핑 클래스 객체가 소멸될 때 자동으로 소멸
자원은 래핑 클래스 객체와 생명 주기를 같이 한다.
실수로 delete를 안해서 메모리 릭이 생기는 상황을 방지할 수 있다.
[파일 입출력]
low level, high level / text mode, binary mode
어느 쪽이든 교차 가능하다.
[메모리]
객체를 만들다: instancing
- [local] stack
- [global]: data -> 초기화 된 영역, bss-> 초기화되지 않은 영역
- [new]: freestore
- [code]
코드 - 데이터 - 프리스토어 - 스택 순서인 줄 알았지만 visual studio에서 데이터 - 코드 - 프리스토어 - 스택 순서임을 확인한 바 있었음.
[STL의 세 가지 요소]
- 컨테이너
- iterator(반복자)
- 알고리즘
STL의 모든 컨테이너는 iterator가 있고 알고리즘 함수는 iterator를 통해 컨테이너에 접근 및 수정이 가능하다.
이렇게 통일된 인터페이스를 사용하기 때문에 어떠한 컨테이너든 동일한 함수로 접근이 가능하다.
[Container]
찾기 속도로 컨테이너를 나눠놓았다.
1. sequence, 2. associative 3. non associative
--sequence-- O(N)
[sequence] array, vector, deque, list, forward - list
[bidirectional] list
[random_access] array, vector, deque
[contiguous] array, vector
[span] random_access한 array, vector, deque를 참조할 수 있다.
string도 span으로 참조 가능한 줄 알았는데 전체 데이터를 참조할 수 없다고 한다.
--associative-- O(log N)
set, multiset, map, multimap
--non associative-- O(1)
unordered set, unordered multiset
unordered map, unordered multimap
키를 해쉬 알고리즘을 통해 정수로 바꾼 뒤 인덱스로 사용하는 컨테이너
vector로 만든 bucket, value가 들어있는 list
--container adaptor--
위에서 정리한 컨테이너를 사용해서 구현한 컨테이너를 container adaptor라고 한다.
stack, queue, flat set, flat map
stack, queue는 vector의 몇가지 기능을 제한하면 쉽게 만들 수 있다.
flat set은 vector를 정렬한 것이다. binary search를 하면 set보다 더 빠르다는 것을 확인한 바 있다.
[Iterator]
- iterator_category // 계층 구조로 이루어 짐 = tag가 붙어 있음
input_iterator_tag
output_iterator_tag
forward_iterator_tag
bidirectinal_iterator_tag
random_access_iterator_tag
contiguous_iterator_tag(concept을 통해 확인 가능)
iterator class 내부에는 iterator_traits라고 해서 타입을을 정의해 놓는다.
using iterator_category = random_access_iterator_tag
using value_type, reference, pointer, difference_type...
여러 연산자들을 오버로딩 하였고 이것을 반복자 어댑터라고 한다.
반복할 수 있는 기능을 갖고 있는 도구들.
iterator class는 컨테이너 안에 만들어서 제공 함.
iterator는 pattern이다.
수 없이 많은 자료 구조에서 iterator 객체를 사용하여 일관된 방식으로 알고리즘 함수를 작성할 수 있다.
[Algorithm]
- 수정할 수 없는 알고리즘 / read
find, contains...
- 수정 가능한 알고리즘 / write
copy, transform, erase , shuffle...
- 정렬 관련 알고리즘
partitial, nth_element, partition_sort, stable_sort, sort
[type traits]
템플릿을 사용하여 컴파일 타임에 코드를 비교 수정 확정 등등 할 수 있는 메타프로그래밍 방식
is_same_v, is_float_point, is_integral 등...
https://koreatopclass.tistory.com/31
https://koreatopclass.tistory.com/32
[concept]
type traits를 가지고서 매개 변수 템플릿에 제약 조건을 거는 방식
concept dispatching 가능
type traits가 하나의 함수에서 선택적으로 코드를 컴파일 했다면
concept는 들어오는 템플릿 매개 변수의 타입을 확인하고 조건에 맞는 함수로 보낸다.
해당하는 함수를 컴파일 타임에 선택하는 것이다.
오버로딩과 비슷하지만 다른 개념이다. 오버로딩은 분기된 모든 함수를 코드화 한다.
https://koreatopclass.tistory.com/33
[ranges, views]
c++20에서 이전 알고리즘들을 concept을 이용하여 새롭게 만듦
constrained algorithm이라고 하며 템플릿 매개 변수를 concept으로 만든 것이다.
views와 결합하여 functional programming language라고 한다.
view(range) adapator: 영역을 변경할 수 있는 도구들
https://koreatopclass.tistory.com/36
책 추천: C++20 풍부한 예제로 익히는 핵심기능
전문가를 위한 C++부터 다 끝내고 읽어봐야겠다.
학습 장소: 한국공학대학교 게임공학과 수업
'---C++ 역량 강화--- > STL 공부' 카테고리의 다른 글
deque (0) | 2024.06.17 |
---|---|
set_intersection (0) | 2024.06.12 |
concept을 이용한 my_distance 구현 (0) | 2024.06.11 |
[c++20] ranges, view (0) | 2024.06.07 |
사용자 정의 리터럴 접미사 (0) | 2024.06.06 |