표준 템플릿 라이브러리-1

출처

아이버 호튼, 『C++14 STL 철저 입문』, (주) 도서출판 길벗(2017-03-02), 1장

http://pjdecarlo.com/2016/06/bash-on-windows-as-integrated-terminal-in-visual-studio-code.html


실행환경

/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