반응형
728x90
반응형

C++에서도 자바스크립트 처럼 익명 함수, 클로져 쓰듯, 사용할 수 있다는게 웹 개발을 해봤던 나로서는 너무 신기하고 놀라웠다. 함수처럼 사용되는 객체 등으로 이미 지원이 되긴 했지만, 

위와 같이 준비를 해야 사용이 가능하므로 불편하긴 마찬가지긴 하다. ( 다른 언어에 비하면 )

자 그럼, 람다 표현식은 다음과 같다.

형식은 위와 같은데, 캡처라는 부분이 사실 처음에 잘 와닿지 않았다. 그런데 자세히 보니, 캡처란? 람다 표현식의 바디 내에서 사용할 외부 변수를 지정해주는 구간일 뿐이었다.

바로 예시를 들겠다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <iostream>
#include <string>
 
int content = 1;
 
int main(void)
{
    std::string str = "IOSTREAM";
    int zero = 0;
    int plus999 = 999;
 
    std::cout << [zero, plus999, str](int a, int b) -> int { 
        std::cout << str << std::endl; content = 400return ((a + b) * zero + plus999); 
    }(5149<< std::endl;
    std::cout << "[zero, plus999, str] content = " << content << std::endl;
 
    std::cout <<  [=](int a, int b) -> int {
        std::cout << str << std::endl; content = 200return ((a + b) * zero + plus999);
    }(5149<< std::endl;
    std::cout << "[=] content = " << content << std::endl;
 
    std::cout <<  [&](int a, int b) -> int {
        std::cout << str << std::endl; content = 400return ((a + b) * zero + plus999);
    }(5149<< std::endl;
    std::cout << "[&] content = " << content << std::endl;
 
    return 0;
}
cs

728x90
반응형
728x90
반응형

 

다음과 같은 배열들을 순회할 것인데, 

1
2
3
4
int numArr[10= { 95732923, };
std::vector<int> numVec(&numArr[0], &numArr[5]);
const char* strArr[3= { "I'm Shyoo""Dog""Mouse" };
 
cs

전통적인(?), 일반적인 순회 방법과 auto 자동 추론을 이용한 반복과 범위 기반 반복을 각각 실험해본다.

일반적인 순회

1
2
3
4
5
6
7
8
9
10
11
12
13
cout << "[기존 배열 순회 방법]" << endl;
 
for (int i = 0; i < 10; i++)
    cout << numArr[i] << ' ';
cout << endl;
 
for (std::vector<int>::iterator it = numVec.begin(); it != numVec.end(); it++)
    cout << *it << ' ';
cout << endl;
 
for(char ** p = (char **)strArr; p <= strArr+2; p++// 억지로 계산하는게 꺼림칙하긴 하지만..
    cout << *<< ' ';
cout << endl;
cs

일반적인 배열, 벡터, 포인터 배열을 순회하는 평범한 코드이다.

자료형 자동 추론을 통한 순회

1
2
3
4
5
6
7
8
9
10
11
12
13
cout << "[자료형 자동 추론]" << endl;
 
for (auto i = 0; i < 10; i++)
    cout << numArr[i] << ' ';
cout << endl;
 
for (auto it = numVec.begin(); it != numVec.end(); it++)
    cout << *it << ' ';
cout << endl;
 
for (auto p = (char**)strArr; p <= strArr + 2; p++)
    cout << *<< ' ';
cout << endl;
cs

auto 키워드를 통해서 인덱스 역할을 하는 변수의 자료형을 알아서 탐지한다.. 너무 편하다 정말

범위 기반 반복 for을 통한 순회

1
2
3
4
5
6
7
8
9
10
11
12
13
cout << "[범위 기반 for문을 이용한 배열 순회]" << endl;
 
for (auto element : numArr)
    cout << element << ' ';
cout << endl;
 
for (auto it : numVec)
    cout << it << ' ';
cout << endl;
 
for(auto p : strArr)
    cout << p << ' ';
cout << endl;
cs

다른 언어에서 지원하는 것처럼 c++도 지원한다. 자바스크립트나 파이썬의 for in과 같고, 자바의 for each 구조와 같다.

 

전체 코드 및 실행 결과

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
#include <iostream>
#include <vector>
 
using std::cout;
using std::endl;
using std::cin;
 
int main(void)
{
    int numArr[10= { 95732923, };
    std::vector<int> numVec(&numArr[0], &numArr[5]);
    const char* strArr[3= { "I'm Shyoo""Dog""Mouse" };
 
    cout << "[기존 배열 순회 방법]" << endl;
    for (int i = 0; i < 10; i++)
        cout << numArr[i] << ' ';
    cout << endl;
 
    for (std::vector<int>::iterator it = numVec.begin(); it != numVec.end(); it++)
        cout << *it << ' ';
    cout << endl;
 
    for(char ** p = (char **)strArr; p <= strArr+2; p++// 억지로 계산하는게 꺼림칙하긴 하지만..
        cout << *<< ' ';
    cout << endl;
 
 
    cout << "[자료형 자동 추론]" << endl;
    for (auto i = 0; i < 10; i++)
        cout << numArr[i] << ' ';
    cout << endl;
 
    for (auto it = numVec.begin(); it != numVec.end(); it++)
        cout << *it << ' ';
    cout << endl;
 
    for (auto p = (char**)strArr; p <= strArr + 2; p++)
        cout << *<< ' ';
    cout << endl;
 
    cout << "[범위 기반 for문을 이용한 배열 순회]" << endl;
 
    for (auto element : numArr)
        cout << element << ' ';
    cout << endl;
 
    for (auto it : numVec)
        cout << it << ' ';
    cout << endl;
 
    for(auto p : strArr)
        cout << p << ' ';
    cout << endl;
 
 
    return 0;
}
cs

실행이 기가 막히게 잘되는 것을 볼 수 있다.

 

728x90
반응형

'프로그래밍응용 > Modern & STL' 카테고리의 다른 글

Lambda Expression  (0) 2021.01.27
R-Value, Copy Elision, 이동 생성자, RVO, NRVO  (0) 2021.01.26
Iterator 사용 방법 예시  (0) 2021.01.05
Priority Queue  (0) 2021.01.04
Queue  (0) 2021.01.04

+ Recent posts