2 minute read

‘전문가를 위한 C++ - Marc Gregoire 지음, 남기혁 옮김’ 책을 참고하여 작성한 포스트입니다.


코드 작성 원칙

  • 템플릿 활용
    • 템플릿을 활용해 제너릭 프로그래밍(generic programming)을 할 수 있다.
    • 제너릭 프로그래밍이란 모든 종류의 객체를 다루고, 코드 작성 시점에 모르던 객체도 처리할 수 있다.
  • 연산자 오버로딩 활용



c++ 표준 라이브러리 둘러보기

스트링

  • string 에 정의되어 있다.
  • c 스타일 문자 배열에 비해 메모리 관리, 스트링 결합 등의 다양한 기능이 있어 스트링을 사용하는 것이 좋다.
  • <string_view> 에 정의 되어 있는 string_view 클래스는 스트링을 읽기 전용으로 표현해 const string& 대신 사용 가능하고, 스트링을 복제하지 않아 오버헤드도 발생하지 않는다.
  • c++20 부터는 format() 사용이 가능하다.

정규 표현식(regular expression)

  • <regex> 에 정의되어 있다.
  • 텍스트의 패턴 매칭(pattern matching) 구현에 유용하다.

I/O 스트림(stream)

  • 입출력에 대한 모델

스마트 포인터

  • <memory>에 스마트 포인터들이 정의되어 있다.

익셉션(exception)

수학 연산 관련 유틸리티

  • <cmath> 에 정의되어 있다.
  • <numeric> 에는 최대 공약수(gcd), 최소 공배수(lcm) 을 계산하는 gcd(), lcm() 이 정의되어 있다.
  • c++20 에 많은 기능들이 추가되었다.(나중에 추가)

시간과 날짜 관련 유틸리티

무작위수(23장)

초기자 리스트

패어와 튜플(24장)

  • <utility>에 정의된 pair 클래스 템플릿은 타입이 서로 다른 두 원소를 하나로 묶어 저장할 수 있다.
  • <tuple>에 정의된 tuple은 pair를 일반화 한 것이다.

어휘 타입(vocabulary type)

  • optional, variant(24장), any(24장) 등

함수 객체(function object)

  • 함수 호출 연산자를 구현하는 클래스이다.
  • <functional> 에 정의되어 있다. (19장)

파일 시스템

멀티스레딩(27장)

타입 트레이트(type traits)(26장)

표준 정수 타입

표준 라이브러리 기능 테스트 매크로(c++20)

(C++20)

소스 위치 (c++20)

컨테이너(container) (18장에서 더 자세히)

  • 정보를 원소 단위로 저장한다.
  • 표준 라이브러리에서 제공하는 컨테이너는 모두 클래스 템플릿이고, 동형 컨테이너(원소 모두 타입이 같음)다.
  • set, map 은 원소를 정렬된 상태로 유지한다.
  • unordered_set, unordered_map 은 비정렬 상태 유지한다

vector를 기본 컨테이너로 사용하는 것이 좋다. list나 forward_list 보다 추가나 삭제 연산이 훨신 빠른데, 최신 CPU에서 메모리와 캐시를 처리하는 방식 때문이기도 하고, 두 리스트는 추가나 삭제할 지점까지 탐색하는 오버헤드가 있기 때문이다. 같은 메모리 공간에 없으면 반복문의 성능도 떨어진다.

알고리즘(algorithm) (20장에서 더 자세히)

  • 정렬이나 탐색과 같은 특정한 작업을 처리하는 전략을 말한다.
  • 표준 라이브러리의 알고리즘은 함수 템플릿으로 구현되어 있어 다양한 타입의 컨테이너에 적용 가능하다.
  • 대부분 <algorithm>에 정의되어 있다.
  • 원소를 순차적으로 처리하는 알고리즘은 항상 반복자를 지원한다.

불변형 순차 알고리즘(non-modifying sequence algorithm)

  • 원소의 값이나 순서를 변경하지 않는다.
  • 크게 세 가지로 나뉘는데,
    • 탐색 알고리즘(search algorithm)
    • 비교 알고리즘(comparison algorithm)
    • 집계 알고리즘(counting algorithm)

가변형 순차 알고리즘(modifying sequence algorithm)

  • 시퀀스의 모든 원소나 일부 원소를 수정하는 알고리즘

작업 알고리즘(operational algorithm)

  • 시퀀스의 원소마다 함수를 실행한다.

교환 알고리즘(swap/exchange algorithm)

  • 두 원소 또는 시퀀스를 맞바꾼다

분할 알고리즘(partition algorithm)

  • 주어진 조건식에 참을 리턴하는 원소가 거짓을 리턴하는 원소보다 앞에 있으면 거짓을 리턴하는 원소를 분할 지점(partition point)이라 하고 그 지점에서 시퀀스를 분할한다.

정렬 알고리즘(sorting algorithm)

이진 탐색 알고리즘(binary search algorithm)

  • 정렬된 시퀀스에 적용된다.
  • 대상 시퀀스가 최소한 탐색할 원소를 기준으로 분할된 상태여야 한다.

집합 알고리즘(set algorithm)

  • 시퀀스에 대해 집합 연산을 수행하는 가변 알고리즘(modifying algorithm)이다.

힙 알고리즘(heap algorithm)

  • priority_queue 구현 시 힙 사용

최대/최소 알고리즘

  • clamp(), min(), max(), minmax() 등..

수치 처리 알고리즘(nuemrical processing algorithm)

  • <numeric> 에 정의되어 있다.
  • 정렬되지 않은 시퀀스에대해 적용 가능하며 선형 복잡도의 성능을 낸다.
  • accuumulate(), 등

순열 알고리즘(permutation algorithm)

  • is_permutation(), next_permutation(), prev_permutation() 등

범위 알고리즘(range algorithm) (C++20)

  • <ranges>에 정의되어 있다.(17장)

##

Tags:

Categories:

Updated:

Leave a comment