윈도우에서 GCC 를 사용하고자 하는 경우 MinGW 를 사용하거나 Cygwin 을 설치하거나 또는 Virtual box 에 리눅스를 설치해서 사용할 수 있다.

 

아래 포스팅에서 TDM-GCC 설치 방법에 대해 소개한 적이 있는데~

  

2013/06/06 - [유틸] - MinGW 64bits 설치


오늘은 MinGW 뿐만 아니라 boost 라이브러리를 사용하고 싶었다.

 

현재 내 PC 환경은 윈도우 7 64비트이다.

 

찾아보니 아래 주소의 MinGW Distro 가 나왔고, x64-native, GCC 4.8.2, Boost 1.55.0 라는 특징을 가지고 있었다.

 

http://nuwen.net/mingw.html

 

또한 C++11 을 default 로 설정해 놓았다고 한다.

 

위 주소에 들어가서 아래 그림의 링크를 클릭해서 다운로드 받는다. 위에 링크된 mingw-11.6.exe 은 git 이 없는 버전이고

 

아래에 있는 mingw-11.6-without-git.exe 은 말 그대로 git 은 빠진 버전이다.

 

나는 git 은 따로 설치를 했었기에 아래에 있는 mingw-11.6-without-git.exe 를 다운로드 받았다.

 

설치는 굉장히 간단한데~ 다운로드 받은 mingw-11.6-without-git.exe 파일을 더블 클릭하고 아래 그림과 같이 path 를 잡아 주면 된다.

 

위 그림과 같이 최상위 폴더를 잡아주면 C:\ 하위에 MinGW 라는 폴더가 생긴다. 그래서 나는 C:\MinGW 에 설치했다.

 

윈도우에서 Codeblocks IDE 에서 boost library 를 사용하여 소문자를 대문자로 변환해 보았다.

 

소문자를 대문자로 변환하는 과정에서 아래 주소에서 확인한 boost 라이브러리의 to_upper() 함수를 사용했다.

 

http://stackoverflow.com/questions/735204/convert-a-string-in-c-to-upper-case

 

Codeblock 셋팅시에 Compiler 를 다음과 같이 방금 설치한 MinGW Distro 에 맞게 설정 해준다.

 

Compiler 의 search directory 역시 아래 그림과 같이 mingw 의 include path(C:\MinGW\include)를 추가해준다.

 

아래와 같이 코딩하고~

 

#include <iostream>

#include <boost\algorithm\string.hpp>

#include <string>

 

using namespace std;

 

int main()

{

 

string str = "Hello World";

 

string newstr = boost::to_upper_copy<string>(str); // 대문자로 변경후 새로운 변수에 저장

 

cout << "before upper : " << str << ",\t to upper : " << newstr << endl;

 

boost::to_upper(str); // // 대문자로 변경후 현재 변수에 저장

 

cout << "Str to upper : " << str << endl;

 

return 0;

}

 

F9 를 눌러서 Build And Run 을 수행해 보면 다음과 같이 정상적으로 동작 한다.



아래 포스팅에서 range based for loops 에 대해 소개 드린 적이 있는데요~

  


2014/03/02 - [programming language/C/C++] - C++ range based for loops

 

Eclipse에서 Range Based For Loops 를 사용하기 위해서 C++11 옵션을 설정을 해야 합니다.

 

Eclipse 에서 C++11 옵션 설정하는 방법은 아래 주소에 나와 있더군요.

 

http://stackoverflow.com/questions/17457069/enabling-c11-in-eclipse-juno-kepler-cdt

 

첫번재로는 프로젝트 클릭후 마우스 오른쪽 클릭하고~ Properties 에 들어가거나 Alt+ Enter 를 누릅니다.

 

그리고 아래 그림과 같이 Miscellaneous 의 제일 끝에 -std=c++11 를 추가 해 줍니다.

 

그리고 Apply 를 눌러서 적용합니다.

 

다음으로 C/C++ general → Preprocessor Include Paths, Macros 에서 Providers 탭에 들어가서~ 체크가 된 GCC Built in Compiler Settings 를 클릭하고 Use global provider shared between projects 옵션을 체크 해제 한 후에 아래 그림과 같이 -std=c++0x 를 추가 합니다.

 

마지막으로 Apply 를 눌러서 적용하고 OK 를 눌러서 빠져 나옵니다.

 

이제 다음과 같이 Range Based For Loops 코드를 실행해 보면 정상적으로 동작 합니다.

 

#include <vector>

#include <iostream>

 

using namespace std;

 

int main(int argc, char **argv) {

    vector<int> vec;

    vec.push_back(10);

    vec.push_back(20);

 

    for (int i : vec) {

        cout << i;

    }

 

    return 0;

}


아래 포스팅에서 소개를 했지만 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