출처
아이버 호튼, 『C++14 STL 철저 입문』, (주) 도서출판 길벗(2017-03-02), 1장
http://pjdecarlo.com/2016/06/bash-on-windows-as-integrated-terminal-in-visual-studio-code.html
실행환경
- vscode + Bash on Ubuntu on Windows
- Bash 버전정보
/etc/lsb-release:DISTRIB_ID=Ubuntu
/etc/lsb-release:DISTRIB_RELEASE=16.04
/etc/lsb-release:DISTRIB_CODENAME=xenial
/etc/lsb-release:DISTRIB_DESCRIPTION="Ubuntu 16.04.5 LTS"
/etc/os-release:NAME="Ubuntu"
/etc/os-release:VERSION="16.04.5 LTS (Xenial Xerus)"
/etc/os-release:ID=ubuntu
/etc/os-release:ID_LIKE=debian
/etc/os-release:PRETTY_NAME="Ubuntu 16.04.5 LTS"
/etc/os-release:VERSION_ID="16.04"
/etc/os-release:HOME_URL="http://www.ubuntu.com/"
/etc/os-release:SUPPORT_URL="http://help.ubuntu.com/"
/etc/os-release:BUG_REPORT_URL="http://bugs.launchpad.net/ubuntu/"
/etc/os-release:VERSION_CODENAME=xenial
/etc/os-release:UBUNTU_CODENAME=xenial
- gcc 버전정보
gcc (Ubuntu 5.4.0-6ubuntu1~16.04.10) 5.4.0 20160609
Copyright (C) 2015 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- 컴파일 방법
g++ -std=c++1y MyCode.cpp
후
./a.out
으로 실행
1.1 기본 아이디어
STL
데이터를 구성하고 처리하는 강력한 도구
STL의 네 가지 라이브러리
1. 컨테이너 라이브러리
- 데이터를 저장하고 관리하고 씀
- array, vector, stack, queue, deque, list, forward_set, unordered_set, unordered_map
2. 반복자 라이브러리
- 반복자(iterator)가 정의되어 있음
- 반복자는 포인터처럼 동작하는 객체
- 반복자는 컨테이너에 있는 객체의 순차열을 참조할 때 사용
- 라이브러리는 iterator 헤더 파일 하나로 정의
3. 알고리즘 라이브러리
- 컨테이너에 저장된 원소에 적용할 수 있는 알고리즘이 폭넓게 정의되어 있음
- 라이브러리는 algorithm 헤더 파일에 정의
4. 수치 라이브러리
- 숫자와 관련된 기능이 폭넓게 정의되어 있음
- 컨테이너에 있는 원소에 수치 처리(numerical processing)를 할 수 있는 기능이 포함
- 랜덤 숫자 생성 기능과 같은 고급 기능도 있음
- 템플릿은 complex, cmath, valarray, numeric, random, ratio, cfenv 헤더 파일에 정의되어 있음
STL을 사용한 예
std::vector<double> values;
std::cout
<< "값은 공백으로 구분해서 입력하세요. 종료하려면 Ctrl+Z를 입력하세요.\n";
values.insert(std::begin(values), std::istream_iterator<double>(std::cin),
std::istream_iterator<double>());
std::cout << "평균값: " << (std::accumulatebegin(values), std::end(values), 0.0)/values.size()) << std::endl;
부동소수점 값들을 표준 입력으로 읽고 평균을 계산해서 출력하는 코드인데
std::accumulatebegin(values)
가 아니라
std::accumulate(std::begin(values))
이 되어야 함 –> 책에 오타가 있음
컴파일 가능한 코드는 다음과 같음
1-1-1.cpp
// 1-1.cpp
#include <iostream>
#include <vector>
#include <iterator>
#include <numeric>
int main(void) {
std::vector<double> values;
std::cout
<< "값은 공백으로 구분해서 입력하세요. 종료하려면 Ctrl+Z를 입력하세요.\n ";
values.insert(std::begin(values), std::istream_iterator<double>(std::cin),
std::istream_iterator<double>());
std::cout << "평균값: "
<< (std::accumulate(std::begin(values), std::end(values), 0.0) /
values.size())
<< std::endl;
}
1-1-1.cpp 실행결과
./a.out
값은 공백으로 구분해서 입력하세요. 종료하려면 Ctrl+Z를 입력하세요.
1 2 3 a
평균값: 2
숫자를 입력받아 values에 저장하는 부분
values.insert(std::begin(values), std::istream_iterator<double>(std::cin), std::istream_iterator<double>());
values에 저장된 값의 평균을 구하는 부분
(std::accumulate(std::begin(values), std::end(values), 0.0) / values.size())
Comments