C++17 STL 프로그래밍 [C++17 표준 라이브러리를 활용하는 90가지 레시피]
- 원서명C++ 17 STL Cookbook (ISBN 9781787120495)
- 지은이야체크 갈로비치(Jacek Galowicz)
- 옮긴이권혁이, 오은진
- ISBN : 9791161753119
- 40,000원
- 2019년 06월 19일 펴냄 (절판)
- 페이퍼백 | 656쪽 | 188*235mm
- 시리즈 : acorn+PACKT, 프로그래밍 언어
판매처
- 현재 이 도서는 구매할 수 없습니다.
책 소개
소스 코드 파일은 여기에서 내려 받으실 수 있습니다.
요약
최신 버전의 C++17 표준 라이브러리에 대한 풍부한 예제로 새롭게 추가된 기능 대부분과 더불어 기존 STL을 C++17에 활용할 수 있는 방법을 제시한다. 세련된 표준 데이터 구조체를 위한 언어적 기능과 표준 라이브러리 및 알고리즘, 자동 리소스 관리 포인터, 람다 표현식, 상수 표현식, 동시성 프로그래밍을 위한 편리한 스레드 제어, 정규 표현식, 난수 생성기, 예외 처리, 가변 템플릿, 사용자 정의 리터럴, 간편한 파일 시스템 순회 등 많은 기능에 대해서 다룬다.
이 책에서 다루는 내용
■ 새로운 핵심 언어 기능과 문제 해결에 활용하는 방법 학습
■ 반복자의 내부 동작과 요구 사항을 구현함으로써 이해
■ 알고리즘과 함수형 프로그래밍 스타일, 람다 표현식 탐구
■ STL에서 제공하는 이식이 용이하며 속도가 빠르고 철저한 테스트를 거친, 잘 설계된 풍부한 알고리즘의 활용
■ 복잡한 C-스타일 코드 대신에 STL 방식의 문자열로 작업
■ 동시성 및 동기화에 대한 표준 지원 클래스의 이해와 사용 방법 학습
■ C++17 STL에서 추가로 이용 가능한 파일 시스템 라이브러리의 사용
이 책의 대상 독자
이 책은 프로그램을 작성하고 컴파일하는 방법을 모르는 독자가 C++를 배우기에 적합한 책이 아니다. 이미 C++ 언어의 기본에 관한 책을 읽어봤다면 고급 단계의 지식을 습득할 수 있는 다음 책이 될 것이다.
다음 항목 중 하나에 해당된다면 이 책을 추천한다.
■ C++의 기본 지식에 대해서 배웠지만, 현재의 지식과 숙련된 C++ 전문가의 지식 사이에 공백이 커서 다음 단계를 어디로 나아가야 할지 모른다.
■ C++에 대해서 잘 알지만, STL과 관련된 지식은 제한적이다.
■ C++98이나 C++11, C++14와 같이 기존 표준 C++에 대해 알고 있다. 얼마나 오래전에 C++를 사용했는지에 따라 이 책은 발견할 수 있는 근사한 새로운 STL 기능을 제공한다.
이 책의 구성
1장, ‘C++17의 새로운 기능’에서는 C++ 언어로 가져온 표준 C++17의 새롭고 근사한 추가 사항을 다루며, 이를 통해 다음 장부터 STL의 추가 내용에 집중할 수 있게 해준다.
2장, ‘STL컨테이너’에서는 STL 컨테이너 데이터 구조체의 풍부한 다양성으로 C++17를 사용해 어떻게 코드를 업그레이드시키는지 설명한다. 서로 다른 컨테이너 전체를 살펴보고 나서 새로운 추가 사항에 대해 자세히 살펴본다.
3장, ‘반복자’에서는 STL 알고리즘과 컨테이너 데이터 구조체가 결합해 밀접한 관계를 갖는 상당히 중요한 추상화 객체인 반복자에 대해 설명한다. 모든 프로그램에서 가장 나은 방법으로 사용할 수 있게끔 반복자 개념 전부를 밑에서부터 확인한다.
4장, ‘람다 표현식’에서는 몇 가지 아주 흥미로운 프로그래밍 패턴을 허용하는 람다 표현식을 살펴본다. C++11에서 처음 소개돼 순수 함수형 프로그래밍 언어에 영감을 받은 람다 표현식은 C++14와 C++17에서 몇 가지 새로운 기능이 추가됐다.
5장, ‘STL 알고리즘 기본’에서는 사용하기 쉽고, 매우 성능 좋고, 검증됐으며, 일반화가 돼 있는 STL 표준 알고리즘의 기본 기능을 소개한다. 이를 어떻게 사용하는지 배워서 시간 낭비 없이 문제에만 집중해 생산성을 높일 수 있다.
6장, ‘STL 알고리즘의 고급 사용’에서는 코드 중복 없이 깔끔하게 더욱 복잡한 구성으로 STL의 기본 알고리즘을 어떻게 결합하는지 시연한다. 예제에서는 더욱 복잡한 문제에 대한 해결책을 구현해 창조적이면서도 STL과 단단히 결합하게 된다. 그리고 필요에 맞게 새로운 알고리즘을 생성해 기존 알고리즘과 어떻게 결합하는지 알아본다.
7장, ‘문자열, 스트림 클래스 및 정규 표현식’에서는 문자열과 제너릭 I/O 스트림 및 정규 표현식과 관련해서 STL에서 제공하는 강력한 클래스를 살펴본다. STL의 해당 부분에 대해 깊이 있게 살펴본다.
8장, ‘유틸리티 클래스’에서는 STL로 난수 생성, 시간 측정, 동적 메모리 관리, 근사한 에러 상태를 전달하는 방법 등을 설명한다. 이와 같은 작업에 대해서 C++ STL이 제공하며, C++17에서 새롭게 추가된 아주 유용하면서도 간편한 유틸리티 클래스를 살펴본다.
9장, ‘병렬 처리와 동시성’에서는 여러 개의 코어 프로세서를 사용하는 시대에 아주 중요한 주제로 다가온 병렬성과 동시성을 위한 기존 C++의 확장을 보여준다. C++11부터 C++17에서 복수의 코어에서 실행돼 동시에 처리되는 프로그램 구현이 필요할 때마다 막대한 도움이 되는 훌륭한 기능이 추가됐다. 9장에서 해당 개념을 알아본다.
10장, ‘파일 시스템’에서는 STL이 항상 개별 파일을 읽고 조작하게 지원되는 게 아니지만, C++17에서 파일 시스템 경로를 다루거나 디렉터리를 탐색하도록 운영체제에 독립적인 완전히 새로운 라이브러리로 많은 수의 새로운 값을 얻은 걸 보여주고, 어떻게 사용하는지 알아본다.
목차
목차
- 1장. C++17의 새로운 기능
- 소개
- 묶음으로 된 반환 값을 풀기 위해 구조체 형태의 바인딩 사용
- if와 switch 구문으로 변수의 범위를 제한
- 새로운 중괄호 초기화 규칙의 강점
- 생성자에서 자동으로 템플릿 클래스 타입 추론
- constexpr-if로 컴파일 시간 결정 단순화
- 인라인 변수로 헤더 전용 라이브러리 활성화
- 표현식 접기로 간편한 헬퍼 함수 구현
- 2장. STL 컨테이너
- 소개
- std::vector에서 삭제-제거 관용구 사용하기
- O(1) 시간으로 정렬되지 않은 std::vector의 요소 삭제
- std::vector 객체에 빠르고 안전하게 접근
- std::vector 객체 정렬 유지
- 필요한 조건을 걸어 효율적으로 std::map에 요소 삽입
- std::map::insert의 새로운 삽입 판별 시맨틱 이해
- std::map 요소의 키를 효율적으로 변경
- std::unordered_map을 사용자 지정 타입으로 사용
- 중복된 사용자 입력 검출 및 std::set을 이용해 알파벳순으로 출력
- std::stack으로 간단한 RPN 계산기 구현
- std::map을 이용해 단어 빈도수 카운터 구현
- std::multimap을 이용해 긴 문장을 찾는 문체 헬퍼 도구 구현
- std::priority_queue를 사용해 할 일 목록 구현
- 3장. 반복자
- 소개
- 자신만의 순환 가능한 범위 생성
- STL 반복자 카테고리와 호환되는 자신만의 반복자 생성
- 제너릭 데이터 구조체를 채우기 위한 반복자 어댑터의 사용
- 반복자 관련 알고리즘 구현
- 역방향 반복자 어댑터를 사용해 반대로 순환
- 반복자 감시자로 범위를 초과하면 반복자 종료
- 확인된 반복자로 반복자 코드를 자동 검사
- 자신만의 zip 반복자 어댑터 생성
- 4장. 람다 표현식
- 소개
- 람다 표현식을 이용해 실행 중인 함수 정의
- 람다를 std::function으로 감싸 넣어 다형성 추가
- 병합을 이용해 함수 구성
- 논리 결합을 이용해 복잡한 프레디케이트 생성
- 같은 입력으로 두 개 이상의 함수 호출
- std::accumulate와 람다를 이용해 transform_if 구현
- 컴파일 시간에 입력 값의 데카르트 곱 생성
- 5장. STL 알고리즘 기본
- 소개
- 하나의 컨테이너에서 다른 컨테이너로 요소 복사
- 컨테이너 정렬
- 컨테이너로부터 특정 요소 제거
- 컨테이너 내용 변환
- 정렬되거나 정렬되지 않은 벡터에서 요소 찾기
- std::clamp로 벡터 값을 특정 숫자 범위로 제한
- std::search로 문자열의 패턴을 찾고 최적화된 구현 고르기
- 큰 벡터 표본화
- 입력 시퀀스의 순열 생성
- 사전식 병합 도구 구현
- 6장. STL 알고리즘의 고급 사용
- 소개
- STL 알고리즘을 이용한 트라이 클래스 구현
- 트라이를 이용한 검색어 추천 생성기 구현
- STL 숫자 알고리즘을 이용한 푸리에 변환 공식 구현
- 두 벡터의 오차 계산
- ASCII 만델브로 렌더러 구현
- 자신만의 알고리즘 직접 생성: split
- 표준 알고리즘을 응용해 유용한 알고리즘 만들기: gather
- 단어 사이의 연속적인 공백 제거
- 문자열의 압축과 압축 풀기
- 7장. 문자열, 스트림 클래스 및 정규 표현식
- 소개
- 문자열 생성 및 병합과 변환
- 문자열의 처음부터 끝까지 공백 제거
- 객체 생성 비용 없이 std::string 사용
- 사용자 입력으로부터 값 읽어오기
- 파일의 모든 단어 개수 세기
- I/O 스트림 처리자로 출력 서식 지정
- 파일 입력으로부터 복잡한 객체 초기화
- std::istream 반복자로부터 컨테이너 채우기
- std::ostream 반복자로 출력 일반화
- 특정 코드 영역을 위한 출력물을 파일로 전달
- std::char_traits로부터 상속받아 사용자 지정 문자열 클래스 생성
- 정규 표현식 라이브러리로 입력 토큰화
- 구문마다 숫자들을 언제든지 완전히 다르게 출력
- std::iostream 에러로부터 읽을 수 있는 예외 발견
- 8장. 유틸리티 클래스
- 소개
- std::ratio를 이용한 서로 다른 시간 단위 변환
- std::chrono를 이용한 절대 시간과 상대 시간 변환
- std::optional을 이용해 실패를 안전하게 밝혀내기
- 튜플에 함수 적용
- std::tuple로 빠르게 데이터 구조체 구성
- 타입에 대해 더 안전한 std::any를 이용해 void* 대체
- std::variant로 다양한 타입 저장
- std::unique_ptr을 이용한 자원 자동 처리
- std::shared_ptr을 이용한 공유 힙 메모리 자동 처리
- 공유 객체에 대한 weak 포인터 다루기
- 스마트 포인터를 이용한 이전 API의 자원 처리 간소화
- 같은 객체의 서로 다른 멤버 변수 공유
- 난수 생성과 올바른 난수 엔진을 고르는 방법
- 난수 생성과 STL로 특정 분배 형성
- 9장. 병렬 처리와 동시성
- 소개
- 표준 알고리즘을 사용해 자동으로 코드 병렬화
- 특정 시간 동안 프로그램 멈추기
- 스레드의 시작과 중단
- std::uniquelock과 std::sharedlock으로 예외에 안전한 공유 잠금 수행
- std::scoped_lock로 데드락 피하기
- std::cout 동시 사용 동기화
- std::call_once로 안전하게 초기화 지연
- std::async를 사용해 백그라운드로 작업 실행
- std::condition_variable로 생산자/소비자 관용 표현 구현
- std::condition_variable를 이용해 다수의 생산자/소비자 표현 구현
- std::async를 이용한 ASCII 만델브로 렌더러 병렬화
- std::future로 간단한 자동 병렬화 라이브러리 구현
- 10장. 파일 시스템
- 소개
- 경로 정규화 도구 구현
- 상대 경로에서 기준 파일 경로 얻기
- 디렉터리 내의 모든 파일 목록 구하기
- 그렙과 유사한 텍스트 검색 도구 구현
- 자동 파일 이름 변경 구현
- 디스크 사용 카운터 구현
- 파일 타입의 통계 계산
- 중복 내용을 심링크로 대체해 폴더 크기를 줄이는 도구 구현