아래 포스팅에서 소개를 했지만 C++ 의 발전은 정말 눈부신 것 같습니다.

 


2012/08/26 - [컴퓨터일반] - C++11 많이 좋아졌네요.

 


예전에 그리 어렵게 했던 또는 귀찮게 했던 것들이 하나 하나 쉬워지는 모습을 보면서 참…. 세상은 계속 좋아지는구나 라는 생각을 많이 하는데요~

 

오늘은 간단하게 아래 주소에서 소개하는 range based for loops 에 대해 소개 드리려 합니다.

 

http://www.cprogramming.com/c++11/c++11-ranged-for-loop.html

 

아래 포스팅의 cartesian.h 파일에서도 range based for loops 를 사용했는데요~ 참 편리하긴 하더군요.


2014/03/01 - [programming language/C/C++] - C++ Cartesian Product


 

C++ 의 vector 와 같은 container 에 대해 for 문 등을 돌릴 때 iterator 를 이용하던 인덱스를 이용하던 해야 했었는데 간단하게 아래 예와 같이 for 문을 돌릴수가 있습니다… 너무 간단해서 이게 C++ 맞나 하는 생각이 들더군요.

 

vector<int> vec;

vec.push_back( 10 );

vec.push_back( 20 );

 

for (int i : vec )

{

cout << i;

}

 

벡터 내의 값을 바꾸고 싶을 때는 다음과 같이 & 기호를 사용해서 이용하면 되고~

 

for (int& i : vec )

{

i++; // increments the value in the vector

}

 

int 라는 타입 조차 생각해서 써주기 귀찮다 하면 auto 라는 키워드를 사용해서 다음과 같이 작성 할 수 있습니다.

 

for (auto& i : vec )

{

i++; // increments the value in the vector

}

 

위 예들은 C++11에서 추가된 기능이니 만큼 최신의 컴파일러를 사용해야 합니다. 저는 gcc (tdm64-2) 4.8.1 을 사용하고 있고 아래 그림과 같이 codeblock 에서 C++11 Compiler Flag 를 체크 했습니다.





C/C++ 프로그래밍에 대한 기존의 제 선입견은 코드량이 많다 입니다.

실행 속도가 다른 언어들 보다 훨씬 빠르지만~

하나하나 짜려면 그 라인 수가 너무 많아서 생산성이 그리 좋지 못하다는 선입견이죠.

그런데 요즘 C++ 의 변화를 보고 있으면 그 변화가 눈부시다는 생각이 들더군요.

C++ 코딩을 하면서 종종 참조하는 사이트인데~ 들어가면 각종 라이브러리나 함수에 대한 정의 및 예제, C++ Tutorial, C++ 역사 등등 C++ 과 관련한 정말 다양한 정보를 얻을 수 있는 사이트 입니다.

 

http://www.cplusplus.com

 

그런데 위 사이트에서 돌아다니다 보면 C++11 이라는 것들이 눈에 띄더군요.

뭔가 해서 보니 2011 년 9월에 만들어진 C++ 표준이라서 C++11 이라고 한다네요.

아래 주소에는 Alex Allain 이라는분이 C++11 에 대해 소개한 내용입니다.

 

http://www.cprogramming.com/c++11/what-is-c++0x.html

 

auto 라는 대단히 편리한 키워드가 눈에 띄더군요. 또한 기존에 nested 형태로 STL 들을 정의 할 때 아래 코드의 빨간색 부분처럼 닫는 Angle Brackets 을 띄어 써야 했었는데 ~~ 아마도 right shift 와 구분이 잘 안돼서 그랬던 듯 ~

 

vector<vector<int> > vector_of_int_vectors;

 

C++11 에서는 이러한 불편함도 수정되서 아래 예처럼 그냥 붙여 쓸 수 있습니다.

 

vector<vector<int>> vector_of_int_vectors;

 

Python에서 보았던 Tuple 이나 Lambda Functions 등도 지원을 하더군요.

 

http://www.cprogramming.com/c++11/c++11-lambda-closures.html

 

C++ 의 다양한 변화에 탄복하다가 Numerics library 의 Pseudo-random number generation 이라는 부분에 눈길이 가더군요.

기존에 C/C++ 에서는 rand() 라는 uniform random number generator 만 제공을 해 줬었죠.


다른 분포 특성들은 이 rand() 함수를 이용해서 알고리즘을 다 이해한 후 하나 하나 작성해야 했습니다.

아래 포스팅에 썼던 것처럼 말이죠. 


2012/01/02 - [컴퓨터일반] - Gaussian Random Variable generation C code


 

 

그런데 C++11 의 Pseudo-random number generation 이 생긴 이후로는 그럴 필요가 없어졌습니다.

 

http://www.cplusplus.com/reference/std/random/


 

위 주소를 보면 아래와 같이 다양한 분포 특성에 대한 생성 함수를 제공해 준다는 것을 알 수 있습니다.

 

우리가 흔히 정규분포라고 얘기하는 Normal(Gaussian) 분포에서부터~ Uniform discrete, Uniform real, Bernoulli, Binomial, Geometric, Negative binomial, Poisson, Exponential, Gamma, Weibull, Extreme Value, Lognormal, Chi-squared, Cauchy, Fisher F, Student T, Discrete, Piecewise constant, Piecewise linear 까지~~ 간단하게 생성 할 수 있습니다.

 

무지하게 편리하겠죠~

 

C++11 너무 써보고 싶어서 간단하게 Gaussian generation 을 해 봤습니다. 아래 주소의 예제 참조 했구요~ 약간 수정했습니다.

 

http://www.cplusplus.com/reference/std/random/normal_distribution/

 

C++11 은 최신의 표준이니 만큼 최신의 컴파일러를 설치해야 되더군요. 저는 GCC 4.7.1 버전을 설치 했습니다. 아래 주소에서 다운로드 받았구요~

 

http://nuwen.net/mingw.html

 

Stephan T. Lavavej 라는 분의 개인 홈피인데~ 마이크로 소프트에서 일한다는 군요 ㅋㅋㅋ Thank you~~~

 

어쨌든 GCC 최신 버전을 설치하고 평균이 5 이고 표준 편차가 4 인 Gaussian random number 를 생성해 봤습니다.

 

코드는 다음과 같습니다.

 

#include <iostream>

#include <iomanip>

#include <string>

#include <map>

#include <random>

#include <cmath>

 

using namespace std;

 

int main()

{

    default_random_engine generator;            // generator 생성

    normal_distribution<double> distribution(5.0,4.0);

 

    map<int, int> hist;            // hostogram 을 그리기 위한 버퍼

    for(int n=0; n<5000000; ++n) {

        ++hist[std::round(distribution(generator))];            // histogram buffering

    }

 

    for(auto p : hist) {                        // * 로 나타내기

        std::cout << std::fixed << std::setprecision(1) << std::setw(2)

            << p.first << ' ' << std::string(p.second/25000, '*') << '\n';

    }

    getchar();                // 결과 창이 없어지지 않게 하기 위함

    return 0;

}

 

위 코드를 돌려 보면~ 아래와 같이 나오더군요~ 많이 본~~ 정규 분포를 세워 놓은 모양이죠? 위에 보시는 바와 같이 코드량이 정말 짧더군요.




 

C++11 강추입니다.


+ Recent posts