C/C++ 프로그래밍에 대한 기존의 제 선입견은 코드량이 많다 입니다.
실행 속도가 다른 언어들 보다 훨씬 빠르지만~
하나하나 짜려면 그 라인 수가 너무 많아서 생산성이 그리 좋지 못하다는 선입견이죠.
그런데 요즘 C++ 의 변화를 보고 있으면 그 변화가 눈부시다는 생각이 들더군요.
C++ 코딩을 하면서 종종 참조하는 사이트인데~ 들어가면 각종 라이브러리나 함수에 대한 정의 및 예제, C++ Tutorial, C++ 역사 등등 C++ 과 관련한 정말 다양한 정보를 얻을 수 있는 사이트 입니다.
그런데 위 사이트에서 돌아다니다 보면 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 버전을 설치 했습니다. 아래 주소에서 다운로드 받았구요~
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 강추입니다.
'컴퓨터일반' 카테고리의 다른 글
Mingw Makefile 을 사용한 빌드 (0) | 2012.10.28 |
---|---|
KMPlayer 깔 때 짜증나는 것들... (0) | 2012.10.21 |
간단하게 동영상 codec 정보 알아보기 (0) | 2012.10.14 |
CodeBlock 에서 FFTW 라이브러리를 사용한 FFT 실습 (281) | 2012.08.26 |
deque 이용 Memory shift 실험 (2) | 2012.08.15 |
자바 환경변수 설정 (0) | 2012.08.11 |
C/C++ memmove() 함수 속도 실험 (4) | 2012.08.06 |
Codeblock 에서 DLL 사용하기 (0) | 2012.07.31 |
댓글