posted by REDFORCE 2017. 6. 14. 11:40


옛날에 공부하면서 만들어뒀던 프로젝트를 하나하나 열어보던 중


야구게임이 있길래 간만에 피식- 미소를 띄우고 봤네요.

코드는 아래와 같습니다.




posted by REDFORCE 2017. 6. 13. 11:46

엔진 공부 중 심심해서 간단히 랜덤으로 중복 된 숫자 없이 값을 뽑아내는 코드를 만들어 보았습니다.





코드는 간단합니다.




1. #include <random> 을 썼습니다.


#include <random> 에 대해서 잘 모르시는 분은 아래 링크를 타고 가셔서 <random>에 대해서 확인하고 오시기 바랍니다 :)


#include <random>


2. 중복 된 값을 뽑는다면 continue~!


간단히 myArray[100] 사이즈만큼 반복을 시키면서 랜덤으로 뽑아낸 값을 넣되,

랜덤으로 뽑아낸 값이 만약 이미 뽑아냈었던 값이라면 다시 뽑기를 시도 합니다~


여기서는 간단히 0~100 사이의 숫자를 넣기 위해 했습니다만


dist(0, 100) 으로 되어있는 랜덤 숫자 뽑는 범위를 더 늘리고 싶으시다면 

dist(0, 1000) 과 같이 (0 ~ 1000사이) 만드셔도 됩니다.


나머지 설명은 딱히 필요없어서 생략하겠습니다.



posted by REDFORCE 2017. 6. 13. 11:24

이번에 올리는 스핀 글 세번째 꺼는 달팽이 모양 출력입니다.



달팽이 모양 출력에 대한 설명은 워낙 제가 따로 하는것보다

구글에 퍼져있는 자료들이 많은지라..


= _ =전그냥 코드만 올려두고 생략하겠습니다.



정말 이해안되신다면 개별적으로 답글달아주시면 설명해드리도록 하겠습니다!




마무리는 아무 생각없이 그냥 올리는 의미없는...

짤방입니다!!! 그냥 ㅁㄴㅇ; ㅏ아그렇..그냥그렇다..구...여....



posted by REDFORCE 2017. 6. 13. 11:19

이번 글은 이전 Spinv.01에 이어서 지그재그로 내려가면서 출력하는 코드입니다.




코드에 대한 설명은 생략합니다..


워낙 짧은 코드라 바로 보면 아마 이해하지 않을까 싶네요.


이해가안된다면??

...음..답글달아주시면 개별적으로 설명은 해드릴지도...



posted by REDFORCE 2017. 6. 13. 11:01

이번에 올릴 C++ 코드는 예전에 공부하면서 만들어 봤던 코드입니다.


결과물을 먼저 사진으로 보여드리자면 아래와 같이 나오네요.



처음 입력값으로 10을 받으면 10x10 행렬로 결과물을 만들어줍니다.


코드는 아래와 같습니다.



1. 먼저 동적으로 행렬을 만들어주기 위해 new / delete를 사용합니다.

즉. 이중 포인터 형식으로 행렬 자리를 만들어줍니다.


2. 원리는 


for (spin = 0; spin < (arrSize*2)-1; spin++) {

for (int i = 0; i < arrSize; i++) {


j = spin - i;

if (j >= 0) {

if (j < arrSize) {

k = k + 1;

arr[i][j] = k;

}

}

}

}


이 부분을 잘 해독하셔서 이해하시길 바라겠습니다!!

절대 제가 설명하기 귀찮아서 그런건 아닙니다!


'Programming > C++' 카테고리의 다른 글

[C++] 달팽이 숫자 출력(Spin v.03)  (0) 2017.06.13
[C++] 지그재그 출력(Spin v.02)  (0) 2017.06.13
[12편-2] Modern C++ 정리: thread  (0) 2017.03.23
[12편-1] Modern C++ 정리: thread  (0) 2017.03.23
[11편] Modern C++ 정리: random  (2) 2017.03.23
posted by REDFORCE 2017. 3. 23. 11:02

이번 글에서는 std::thread 의 공유자원에 대한 사용 방법과


mutex / lock 에 대해서 정리해보도록 하겠습니다.




공유 자원 사용하기

  • 멀티스레드 프로그래밍에서는 공유 리소스 관리가 가장 큰 문제
  • 너무 빡빡하게 관리하면 성능 하락의 위험
  • 너무 느슨하게 관리하면 언제 터질지 모름
  • mutex를 사용하여 공유 리소스를 관리하는 것이 가장 일반적인 방법
  • mutex는 크리티컬 섹션 (Windows에서는)을 사용한다.



#include <mutex> 헤더가 필요하고~


std::mutex mtx_lock를 선언하여

lock() / unlock() 함수를 통해 공유 자원에 접근하고 관리 할 수 있습니다.


( [&] 람다가 등장해 있군요. 다시 복습차원에서... [&] 캡쳐를 했다는 것은 스코프 영역의 모든 변수를 참조 한다는 뜻 입니다! )



공유 자원을 사용 할 수 있는지 조사


그럼 공유 자원을 mutex를 통해 lock / unlock만 하면 되냐~?

당연히 그걸론 부족하조.


다른 쓰레드가 lock을 걸어서 자원을 쓰고 있는지 안쓰고 있는지 검사를 해야겠지요.


순서를 정리해보자면 다음과 같습니다.

  • (1) 스레드 A 가 mutex의 lock 을 호출 했을 때,
    (2) 이미 스레드 B에서 lock을 호출 했다면?
    (3) A는 B가 lock을 풀어줄 때 까지 대기한다.

  • 스레드 A는 일을 하고 싶어도 할 수가 없다.
    이때 try_lock() 을 사용한다!

  • 다른 스레드가 먼저 락을 걸었다면 대기하지않고 즉시 false를 반환,
    반대로 true를 반환한 경우 공유 리소스의 소유권을 가진다.


자동으로 lock 풀기


그럼 이번에는 혹여나 실수로 unlock을 호출하지 않은 경우는 어떻게 되는가?


당연히 실수로 unlock을 호출하지않고 나와버렸으니 스레드는 데드락에 빠지는 상황에 놓입니다.

이 상황은 프로그래머의 코드 상의 실수 보다는

스레드가 코드 수행 중 예외 상황이 발생하여 빠져 나가버리는 경우가 큽니다.

(프로그래머가 이런 실수를 했다면 그건...야근을 너무 많이 한 탓일 수도 = _=;;)


해서 이런 문제가 발생할 경우를 대비해


lock_guard 라는 유틸리티 클래스를 사용합니다.


scope를 벗어날 때 자동으로 unlock을 호출하는 녀석인데요.




std::lock_guard<std::mutex> guard(mtx_lock) 부분을 보시면


먼저 std::lock_guard<std::mutex> 타입형으로 guard 라는 변수와 함께 파라미터로 ( mtx_lock ) 을 받습니다.


따라서 뮤텍스를 받는 녀석이라는 건데


이녀석을 알아서 스레드 안에 넣어두면 guard가 함수의 스코프가 벗어날 때 unlock을 호출하여 줍니다.





이번엔 데드락 상황을 한번 연출 해보고 


빠져나가는 방법을 적어보도록 하겠습니다.



상황은 위 코드와 같이 isCheck( ) 안에서 guard를 통해 lock1 이 만들어졌을 상황인데


아래 다른 쓰레드가 Add ( )를 호출하는 바람에 또 다시 Guard가 만들어져 lock2 만들어지게 되면


결국 데드락 상황에 빠지게 됩니다.



해서 이런 반복적인 락으로 인해 빠지는 데드락을 회피 하고자 쓰는 mutex가 있는데요.


바로 std::recursive_mutex 를 이용 하시면 됩니다.




m_Mutex 선언 부를 보시면 타입이 std::recursive_mutex로 바뀐 것을 볼 수 있습니다.


아직 저도 정확히 recursive_mutex는 어떤식으로 회피를 하는지는 모르겠습니다만 원초적인 원리를 알게 되면 따로 또 포스트를 적겠습니다.




쓰레드를 딱 한번만 실행

  • 멀티스레드 환경에서 프로그램 실행중 단 한번만 코드 실행이 필요 할 때
  • 보통은 이중 조사로 구현하지만...(실수가 발생 할 수 있음)
  • std::call_once 를 사용하면 쉽게 가능~



사용 방법은 위와 같이


(1) std::once_flag 를 이용하여 플래그 값을 먼저 세워두시고 

(2) std::call_once 를 통해 플래그 값과 펑션을 던져 주시면 됩니다.


만약 이 플래그 값을 통해 펑션을 수행했다면 flag 값이 변경되고 나 사용했음~~ 하고 표기할 수 있게 됩니다.


이를 응용하여 스레드에서 flag값을 보고 이거 한번 해야되는데...했었나? 안했었나?? 하는걸 알 수 있게 됩니다.




여기까지 Modern C++ 12편으로 정리한 내용을 마치겠습니다.


부족한 내용이나 설명이 부실 한것도 많습니다만.



= _=)..아몰랑 일단 나만 알면되...

posted by REDFORCE 2017. 3. 23. 09:31

와...드디어 마지막 목차 인 thread로 왔습니다.


이틀 만에 이걸 싹다 다시 공부하며 정리하면서 올렸는데


다시 상기가 많이 된 것 같군요.


(근데 왜 정작 쓸 때는 또 다시 켜서 보는걸까.....= _=난 빠가야로 였단말인가)



목차


1. Auto

2. range based for

3. enum class

4. non-static data member initializers

5. initializer lists

6. default / delete definition

7. override / final

8. emplacement

9. constexpr

10. lambda

11. random

12. thread



12. thread


이번 글은 마지막인 thread에 대해서 정리해보도록 하겠습니다.


프로그래밍의 꽃이라 부를 수 있는 thread ( 쓰 뤠 두으우엑 우엑...공부할 때 마다 극혐 토나온닷..)



여기서 정리하는 thread는 C++ 표준 thread 라이브 러리 입니다. (std::thread)


#include <thread> 헤더가 필요하며


각 OS API의 쓰레드보다 사용하기가 쉽다는 장점이 있습니다.



std::thread의 사용 법은 아래와 같이 간단합니다.



std::thread 타입으로 thread를 선언하고 ( ) 안에 함수 내용을 적으시면 됩니다.

위와 같이 람다로 구현하는 방법도 가능합니다.



thread를 생성하고 특정한 시기에 동작하게 하려면 다음과 같이 수행하면 됩니다.



위 코드와 같이 myThread를 선언만 해놓고

정의는 추후에 하는 방식으로 내가 원하는 타이밍에 동작하게 할 수 있습니다.


다음, thread의 파라미터 값을 넣는 것도 아래와 같이 수행하면 넣을 수 있습니다.



위 코드의 마지막 줄에 람다 함수가 끝나고 " , 4" 를 넣어준것 과 같이 파라미터를 전달 하면 됩니다~



이번에는 클래스의 멤버 함수를 스레드에서 사용하는 방법입니다.


아마 이 방법이 제일 궁금하셨을텐데요.


위에 적어둔 방법들과 똑같이 thread의 매개변수로 펑션만 던져주시면 됩니다.




쓰레드 대기


thread 클래스의 join 함수를 사용하여 스레드가 종료 할 때 까지 대기하는 방법입니다.


 - join() 함수를 호출하면 blocking이 된다.

 - join() 함수를 호출할 수 있는 지 알기 위해서는 joinable() 함수를 사용한다.



쓰레드 식별자


쓰레드를 식별 하는 방법은 get_id() 함수를 사용하면 해당 쓰레드의 식별자를 얻을 수 있습니다.


get_id() 함수를 통해서 멀티쓰레드에서 각각의 쓰레드를 구분 할 수 있지요.


get_id() 함수를 사용하면 멀티스레드에서 공용 리소스에 접근하는 스레드를 알 수 있고,

특정 스레드만 접근할 수 있게 하는게 가능합니다.



thread 오브젝트와 (커널)스레드 분리

  • detach 함수를 사용하면 thread 오브젝트와 스레드 연결 고리를 떼어낸다.
  • detach 이후에는 thread 오브젝트는 제어 할 수 없다.
  • detach 와 스레드의 종료는 상관 없다.



thread를 한번 detach 한 순간 부터는 그 쓰레드는 완전 독립이 되기 때문에 join과 같은 함수를 사용 할 수가 없습니다.


따라서 그 쓰레드가 언제 어떻게 될진 그 쓰레드한테 달려있다고 볼 수 있지요.


저는 개인적으로 이런식으로 detach를 쓸일이 있나? 하는 생각도 듭니다만...


= _=뭐 언젠가 필요한 때도 있겠지요.



일시중지와 양보

  • sleep_for 와 sleep_until을 사용하면 스레드를 일시 중지 시킬 수 있다.
  • sleep_for 는 지정한 시간 동안 ( 예: 100 밀리 세컨드 동안만 정지)
  • sleep_until 은 지정 시간까지 ( 예: 16시 10분까지 정지)
  • yield를 사용하여 자신(스레드)의 활동을 포기하고 다른 스레드에게 양보한다.
    std::this_thread::yield();


thread 종료
  • 스레드가 실행 중에 프로그램이 종료되면 crash가 발생 할 수 있다.
  • 프로그램 종료 전에 꼭 스레드를 먼저 종료 시키고 프로그램을 종료하도록 한다.



여기 까지가 기본적인 std::thread에 대한 정리였습니다.


그리고 더 이제 심화적이고 중요한 thread의 공유자원 사용하는 방법과 mutex / lock 에 대해서 다음 글을 통해 살펴보도록 하겠습니다.


posted by REDFORCE 2017. 3. 23. 08:46

목차


1. Auto

2. range based for

3. enum class

4. non-static data member initializers

5. initializer lists

6. default / delete definition

7. override / final

8. emplacement

9. constexpr

10. lambda

11. random

12. thread


대망의 11편 랜덤 입니다!


11. Random


이번 글은 random에 대해서 정리해보도록 하겠습니다.



과거 C++ 03 까지만 해도


우리는 랜덤한 난수를 쓰기 위해


이런 코드를 작성했었지요...



음...참 그냥 무식한 난수분포기 였습니다.


srand...오랜만에보는군요 = _=)..




먼저 C++03과 C++11의 난수분포기 차이를 비교해보겠습니다.


  C++03 난수분포기

  C++11 난수분포기

 

  • C런타임 난수를 사용

  • 전역 함수 사용

  • 의사 난수 주기가 짧음 ( 최대 32767 )

  • 균등하게 분포되지 않음

  • 기능적으로 빈약함

 

  • 고품질의 난수 생성기와
    분포 클래스를 사용

  • 난수의 형/범위/분포 형태를
    세세하게 조절 가능


사용 방법은 먼저 아래와 같이 간단합니다.




#include <random>에 만들어져있는 std::mt19937 을 이용하는 것인데요.


std::mt19937은 난수 생성기로


Mersenne twister(32비트 버전) 과 std::mt19937_64(64비트 버전) 이 있습니다.



난수를 생성할 때 한번 seed 값을 이용하여 생성해보도록 할까요.





위와 같이 chrono를 이용하여 seed 값을 토대로 난수를 생성할 수 있습니다.


아..혹시나 seed가 뭔말임? 하고 이해 못하시는 분들이 계실까봐.



위쪽에 0 ~100 까지의 난수를 뽑아내기 위해 rand() % 101 을 한 경우가 있지요?


그와 같은 경우라 보시면 될 것 같습니다.

(아니야! 잘못됐어! 라면 지적 해주세요. 사실 저도 정확히 이게 맞나 긴가민가합니다)


[seed 뜻 수정 : 어떤 숫자를 가지고 특정한 수식을 적용 시켜 나온 숫자를 랜덤이라 할 때 필요한 수식에 대입할 숫자를 seed라 부름]



예측 불가능한 난수 생성


혹여나 보안 목적과 같이 절대 예측할 수 없는 난수를 생성하고 싶다면 비 결정적 난수 생성기를 사용해야합니다.


지금 우리가 본 mt19937은 의사 난수라 해서 우리가 일정범위를 지정하고 주관적인 의사가 들어간 난수 입니다.



그럼...예측 불가능한 난수를 어케만드냐?



std::random_device 를 이용하시면 됩니다.


난수 생성을 위해 화면상의 마우스 커서를 이리저리 움직여주세요~ 라는 프로그램같은걸 본적이 있으신가요?


예전에 저는 이런 것을 tortoiseGit 을 사용해 볼 때 난수 생성을 통해 암호알고리즘을 돌리는 것을 본적이 있습니다.



사실 소프트웨어적으로 난수를 생성하는 것은 비결정적 난수를 생성함에 한계가 있습니다.


따라서 이 난수를 하드웨어적으로 움직여서 난수 생성중인 본인도 알기 어려운 (마우스 움직임과 같은) 하드웨어를 이용하는 것이지요.


(난 마우스를 1px 우측으로 움직이고 있어! 라고 미세하게 조정이 가능한 신급 감각을 가진 인물이 라면 가능할지도..)



그래서 다음과 같이 랜덤한 디바이스를 통해 아래 코드 방식대로


비 결정적 난수를 생성 할 수 있습니다.



범위안의 난수 생성

  • 특정 조건 안에 만족하는 난수를 원한다 ( 예 : 1~ 100 사이 )
  • 난수를 특정 타입과 특정 범위 안에서 생성하기 위해서는
    난수 생성기에 난수 분포기를 더하여 난수를 생성한다.
  • 정수 타입의 난수를 분포 할 때는 uniform_int_distribution,
    실수 타입의 난수를 분포 할 때는 uniform_real_distribution 을 사용


위 설명대로 어떤 범위의 난수를 생성 할 떄는 다음과 같이 사용 할 수 있습니다.



차례대로 설명 드리자면 


먼저 난수 생성기! mt19937을 선언하여 rng1(3244) 라고 값을 넣어 아무 숫자나 생성합니다~


그 다음 난수 분포기 uniform_int_distribution 을 이용하여 난수의 분포범위를 결정합니다. ( -3, 3 ) 사이~



해서 난수 분포기 안에 난수 생성기를 넣지요!  // dist1( rng1 )



주의할 점.


std::uniform_intdistribution dist와 std::uniform_real_distribution은 포함 범위가 다르므로 주의!



std::uniform_int_distribution dist( -3, 3 )   // -3 이상,  3까지.


std::uniform_real_distribution<double> dist ( 0.0, 1.0 ) // 0.0 이상, 1.0 미만!



그 외 다양한 난수분포기 들이 있습니다만


대표적으로 사용 되는 녀석들만 적어보도록 하겠습니다.



bernoulli_distribution  분포기

 - 확률을 지정하면 이 확률에 근거하여 true 와 false 를 반환

(예: 몬스터 잡으면 n% 확률로 xx 아이템을 드롭!)


binomial_distribution 난수 분포기

 - 특정 확률로 n 회 실시 했을 때 몇 번 성공 할 것인가를 반환

(예: 사망 가능성(확률)이 있는 백신을 N 사람에게 투여하여 성공할 횟수는?)


normal_distribution 난수 분포기

 - 평균과 표준편차로 정규 분포 난수를 생성한다.

(예: 평균 키 173cm, 표준 편차 5cm 의 신장 데이터를 생성!)



위에 적힌 3가지 외에도 엄청나게 많은 난수 생성기와 분포기가 #include <random> 안에 들어가 있습니다만..


필요한건 그때 그때 찾아서 쓰시거나 직접 로직을 만드시는게 편할거라 봅니다.




결론. 개인적으로 srand() 보단정말 세밀하군요. |(O_ o)/

'Programming > C++' 카테고리의 다른 글

[12편-2] Modern C++ 정리: thread  (0) 2017.03.23
[12편-1] Modern C++ 정리: thread  (0) 2017.03.23
[10편] Modern C++ 정리: lambda  (3) 2017.03.23
[9편] Modern C++ 정리: constexpr  (0) 2017.03.23
[8편] Modern C++정리: emplacement  (0) 2017.03.23
posted by REDFORCE 2017. 3. 23. 07:43

목차


1. Auto

2. range based for

3. enum class

4. non-static data member initializers

5. initializer lists

6. default / delete definition

7. override / final

8. emplacement

9. constexpr

10. lambda

11. random

12. thread


와...드디어 10편까지 왔네요. 이틀 동안 열심히 적었습니다만


솔직히 많이 부족하고 너무 설명이 빈약하고 그냥 이런식으로 하면되!


라는 어조로 적어버린 것 같아 죄송합니다.



계속 노력해서 더 좋은 설명을 곁들이도록 할게요!



2. lambda


이번 글은 lambda에 대해서 정리해보도록 하겠습니다.


람다에 대해서 간단히 설명하자면 다음과 같습니다.


  • 'lambda 함수' 또는 '무명 함수' 라고 부르기도 한다.
  • lambda는 함수 오브젝트 이다.
  • C++의 표현력을 증가시켜 준다.
  • STL의 알고리즘을 더 간편하게 사용할 수 있다.
  • 규격에서는 lambda는 특별한 타입을 가지고 있다고 한다.
  • 단! decltype나 sizeof 에서 사용 할 수 없다.


람다의 사용 방법은 4가지만 잘 익혀두시면 됩니다.



위에서 차례대로 설명드리겠습니다.


먼저 어떤 스코프의 영역에서 람다를 쓰실려면    [ ] 를 이용하여 람다를 캡쳐~! 합니다.


그러면 컴파일러가 어? 람다 쓰넴. 하고 알게됩니다.



그 다음 이용할 ( ) 를 통해 파라미터 인수를 정의합니다.

(만약 딱히 파라미터 받을 거 없는데? 하면 안써도 됩니다)


그리고 { } 안에서 함수의 본체를 정의합니다.


마지막으로 ( ) 를 통해 우리가 만든 람다 함수를 호출하면 끝!



간단하게 위와 같이 사용하시면 됩니다.

(역시나 파라미터 없는데~? 하면 안써도 무방합니다)



그리고 람다 함수본체까지만 정의하고 auto를 이용해 함수를 auto func 에 담아둔 뒤


func( )를 이용한 호출도 가능합니다!


왜??  위에서 언급했다싶이 Lambda 또한 함수 오브젝트! 이기 때문이지요!



그리고 람다 자체를 함수의 파라미터로 이용할 수 있습니다.




람다 자체의 파라미터를 사용해보는 것도 확인해볼까요.



역시나 쉽습니다.


그냥 파라미터 값도 알아서 척척 넣어주게 되네요.




그 다음 lambda를 이용한 반환(리턴)을 써보겠습니다.



반환하는 방식도 여타 함수와 똑같습니다. 그냥 함수 본체에다 리턴만 알아서 하면되네요.




그럼 이 람다를 응용해서 함수안에 람다 함수를 넣어서 써보도록 하조



네...잘들어갑니다 ㅡ_ ㅡ)...그냥 함수나 어떤 스코프범위 안에서 


그냥  [ ] 캡쳐를 이용해서 선언만 하면 어디서든 람다를 바로바로 넣을 수 있습니다.



그리고 lambda 함수 자체를 반환하는 함수로 만들어 사용도 가능합니다.




그런데 개인적으로 이런식으로 쓰고 싶지는 않네요...


함수 포인터를 써야하는 과정에서 람다를 이용해 어딘가에 템플릿 형태로 만들어놓고 그걸 리턴 하는 용도로 쓴다면


나름 괜찮을 것 같습니다.



자 그런데..위 코드에 보면 [ ] (캡쳐) 부분에 [=] 이런식으로 들어간 게 보일 겁니다!


응? 못보던건데 저게 뭐지 할텐데요.



Capture 라 불리는 [ ] 구역의 용도는 정확히 


lambda를 정의한 scope 내의 변수를 capture 하는 용도입니다!


Scope의 모든 변수를 참조로 capture 할 때는 [&], 특정 변수를 참조로 capture 할 때는 [&변수]

Scope의 모든 변수를 복사로 capture 할 때는 [=], 특정 변수를 복사로 capture 할 때는 [변수]


를 적으면 됩니다!  ( 무슨말?? )


바로 한번 써보도록 할까요.




위와 같이 람다 함수내에서 지금 스코프의 영역에 있는 변수를 참조하여 값을 변경하거나 할 때는 [&]를 이용해 x 값을 받아 올 수 있습니다.



그럼 [=]를 이용한 복사는?



당연히 값 복사만 일어나기 때문에 스코프내의 변수를 바꿔버리는 행위는 에러를 뿜게 됩니다.


순전히 값 복사와 람수 함수 내부적으로 일어나는 변환에 대해서만 처리를 할 수 있습니다.



그러나 필요하다면 


mutable을 이용하여 다음과 같이 람다 함수 내에서만 일시적으로 x 값을 변경 할 수 있습니다.




람다 함수를 빠져나오면 다시 x 값은 원래 값으로 보존이 됩니다.



다음은 람다의 capture : default 에 대해서 보도록 하겠습니다. 

capture : default 라는 말은 우리가 람다를 씀에 있어서


capture가 어떻게 돌아가는지 본다는 뜻 입니다.



위와 같이 람다의 캡쳐 내에서 설정을 어떻게 하냐에 따라 스코프영역의 변수들의 참조/복사를 할 수 있습니다.



람다에 대한 특징을 정리해보겠습니다.


클래스에서 lambda 사용

  • 클래스의 멤버 함수에서 lambda 사용 가능
  • public, protected, private 멤버도 접근 가능
  • lambda는 클래스에서 friend로 인식
  • lambda에서 클래스 멤버를 호출 할 때는 this를 사용한다.


Generic lambdas

  • C++ 14
  • 인수 타입으로 auto를 사용할 수 있다.
  • 템플릿 인수와 같이 형 추론된다.
  • [ ] (const auto& x, const auto& y) { return x + y; }

  • 가변 인수로 사용 할 수 있다.
  • [ ] ( auto&&... args) { std::cout << sizeof...(args) << endl; } (1U, 2.1, nullptr, hoge{ } );

  • auto를 사용하는 것은 구현에서 필수는 아니다.
    다만 가독성을 위해 붙여주도록 하자!

마지막으로 generic lambda 사용을 보도록 하겠습니다.





여기까지가 C++ 14의 람다 였습니다.


람다에 대한것은 잘 사용하면 정말 편하고 코드를 간결하게 만들 수도 있으며

알고리즘을 구현하는데 있어서 많은 도움이 될 거라 봅니다.


저도 아직은 자주 쓰는 편은 아니지만


일부 구역에서는 람다를 이용해서 굳이 필요없는 펑션 구현을 줄일 수 있다는 점에서는 애용하고 있습니다.



많은 도움이 되셨기를....


혹시나 보셨다면 리플이라도...(굽신 굽신)

posted by REDFORCE 2017. 3. 23. 07:39

목차


1. Auto

2. range based for

3. enum class

4. non-static data member initializers

5. initializer lists

6. default / delete definition

7. override / final

8. emplacement

9. constexpr

10. lambda

11. random

12. thread



2. constexpr


이번 글은 constexpr에 대해서 정리해보도록 하겠습니다.



constexpr은 변수, 함수, 클래스를 컴파일 타임에 정수로 사용할 수 있다.

[이 말은 상수로 취급할 수 있는 작업은 컴파일 타임에 처리하도록 한다는 말!]


#define 이나 템플릿을 대체하여 사용 할 수 있다.




음...?그래서 어떤식으로 쓴다는 거지? 하고 느끼실 텐데요.


아래와 같이 #define을 이용한 매크로에도 써먹어서 컴파일타임에 상수로 사용이 가능합니다.




#define으로 처리하면 빌드를 해봐야지 알 수 있었던 에러를


미리 컴파일타임에 컴파일러가 띄워줄 수 있는 방식이니 


우리는 프로젝트를 빌드하지 않고도 바로바로 에러가 날 수 있는 녀석들을 확인 할 수 있습니다.