Skip to content

Commit c2ff514

Browse files
committed
2화 세미나 발표 자료 업로드
1 parent e0e716e commit c2ff514

13 files changed

+374
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
#include<iostream>
2+
#include<vector>
3+
#include<random>
4+
#include<range/v3/all.hpp>
5+
6+
using namespace ranges;
7+
using std::cout;
8+
using std::endl;
9+
10+
int main()
11+
{
12+
std::default_random_engine gen;
13+
std::vector<int> v = view::iota(0, 10);
14+
15+
action::shuffle(v, gen);
16+
// 아래 코드들도 위와 같은 의미
17+
//v | view::all | action::shuffle(gen);
18+
//v |= action::shuffle(gen);
19+
20+
cout << view::all(v) << endl;
21+
//[2,7,8,4,0,6,1,9,3,5]
22+
23+
auto v2 = v | ranges::copy | action::sort;
24+
cout << view::all(v2) << endl;
25+
//[0,1,2,3,4,5,6,7,8,9]
26+
27+
// 짝수만 셔플
28+
v = view::ints(0, 10);
29+
v | view::stride(2) | action::shuffle(gen);
30+
cout << view::all(v) << endl;
31+
//[6,1,8,3,2,5,0,7,4,9]
32+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
#include<iostream>
2+
#include<vector>
3+
#include<range/v3/all.hpp>
4+
5+
using namespace ranges;
6+
using std::cout;
7+
using std::endl;
8+
9+
int main()
10+
{
11+
std::vector<int> v = {1, 3, 5, 6, 7};
12+
auto all = view::all(v); // container '같은 걸' view 로 전환할 때
13+
cout << all << endl;
14+
cout << typeid(all).name() << endl;
15+
// iterator_range<vector_begin<int>(), vector_end<int>())
16+
17+
// all 의 각 요소는 iterator 가 아니라 v의 원소.
18+
for (auto e : all)
19+
cout << e << " ";
20+
cout << endl;
21+
22+
// 반면 iota(begin(), end()) 는 각 원소가 iterator
23+
auto iota = view::iota(v.begin(), v.end());
24+
auto deref = iota | view::transform([](const auto iter) {return *iter; });
25+
cout << deref << endl;
26+
27+
for (const auto iter : iota)
28+
cout << *iter << " ";
29+
cout << endl;
30+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
#include<iostream>
2+
#include<vector>
3+
#include<set>
4+
#include<unordered_map>
5+
#include<range/v3/all.hpp>
6+
7+
using namespace ranges;
8+
using std::cout;
9+
using std::endl;
10+
11+
int main()
12+
{
13+
std::set<int> s = view::iota(0, 10);
14+
std::vector<int> v = view::iota(0, 10);
15+
16+
// pairÇü ¹üÀ§´Â view::zip() À¸·Î
17+
auto rng = view::zip(view::iota(0), view::iota(10)) | view::take(5);
18+
std::unordered_map<int, int> m = rng;
19+
20+
for (auto e : m)
21+
{
22+
cout << e.first << ", " << e.second << endl;
23+
}
24+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
#include<iostream>
2+
#include<vector>
3+
#include<range/v3/all.hpp>
4+
5+
using namespace std;
6+
using namespace ranges;
7+
8+
int main()
9+
{
10+
// view::for_each 는 Range<T> 객체를 리턴
11+
auto r = view::for_each(view::iota(0, 10), [](int i) {
12+
// view::for_each 는 기본적으로 각 루프의 결과를 join 하여 하나의 view<Rng>로 만드려 한다.
13+
// 각 결과를 하위 범위로 유지하고 싶을 경우 yield() 를 사용한다. (한번 더 그룹해준다.)
14+
//return yield_from(view::repeat_n(i, i)); // yeild_from : 매개변수가 view<Rng>인지 확인하는 용도. 기본적으로 각 그룹이 조인해서 나옴.
15+
//return yield_if(i % 2 == 0, i); // yeild_if : 조건식이 true 일 때에만 리턴. 내부적으로 repeat_n 호출. 두번째 매개변수에 view<Rng>를 넣을 경우 yield_from 과는 다르게 그룹지어 나옴.
16+
return yield(i); // yield : 내부적으로 view::single() 호출. 그룹지어 나오게 함.
17+
});
18+
19+
cout << typeid(r).name() << endl;
20+
21+
cout << r << endl;
22+
23+
// ranges::for_each 는 v.end() 를 리턴
24+
vector<int> v = view::iota(0, 10);
25+
auto it = ranges::for_each(v, [](int i) {
26+
cout << i << " ";
27+
});
28+
cout << endl;
29+
cout << typeid(it).name() << endl;
30+
cout << boolalpha << (it == v.end()) <<endl;
31+
32+
auto lamda = [](int i) {
33+
cout << i << " ";
34+
};
35+
36+
// std::for_each 는 세번째 인자로 넣었던 callableType을 리턴
37+
auto it2 = std::for_each(v.begin(), v.end(), lamda);
38+
cout << endl;
39+
cout << typeid(it2).name() << endl;
40+
cout << boolalpha << (it2 == lamda) << endl; // 복사된 functor기 때문에 서로 다른 객체지만 bitwise equal.
41+
// 비교 가능 => 즉 같은 타입이라는 게 중요
42+
43+
// 물론 view 도 begin(), end()로 순회 가능하기 때문에 range-based for loop 가능
44+
for (auto e : view::iota(0, 10))
45+
{
46+
cout << e << " ";
47+
}
48+
cout << endl;
49+
50+
// begin(), end() 멤버변수도 가지고 있음 (view_facade 에 구현되어 있음)
51+
auto vRng = view::iota(0, 10);
52+
for (auto it = vRng.begin(); it != vRng.end(); ++it)
53+
{
54+
cout << *it << endl;
55+
}
56+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
#include<iostream>
2+
#include<vector>
3+
#include<range\v3\all.hpp>
4+
5+
using namespace std;
6+
using namespace ranges;
7+
8+
int main()
9+
{
10+
std::vector<int> numbers = view::iota(0, 12);
11+
12+
auto r = numbers | view::group_by([](int a, int b) {
13+
//cout << endl << "group_by { " << a << ", " << b << " }" << endl;
14+
return a / 3 == b / 3;
15+
}) | view::group_by([](const auto& r1, const auto& r2) {
16+
return front(r1) / 6 == front(r2) / 6;
17+
}) | view::remove_if([](const auto& r) {
18+
return front(front(r)) >= 6;
19+
});
20+
21+
cout << typeid(r).name() << endl;
22+
23+
auto r2 = r | view::join; // r에 재배정 할 수 없다. 타입이 변하기 때문
24+
25+
cout << typeid(r2).name() << endl;
26+
27+
cout << r << endl;
28+
cout << r2 << endl;
29+
30+
for (auto e : numbers)
31+
{
32+
cout << e << " ";
33+
}
34+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
#include<iostream>
2+
#include<algorithm>
3+
#include<vector>
4+
#include<range\v3\all.hpp>
5+
6+
using std::cout;
7+
using std::cin;
8+
using std::endl;
9+
using std::vector;
10+
using namespace ranges;
11+
12+
// 아래와 같은 수열을 구해라
13+
//[0,1,2,3,4,0,1,2,3,4,0,1,2,3,4]
14+
int main()
15+
{
16+
// for루프를 이용한 방식
17+
// 컨테이너를 원하는 크기로 만들고, 반복문을 이용해 내용을 직접 채워넣는다. (사고의 흐름의 반대)
18+
vector<int> v1(15);
19+
for (int i = 0; i < v1.size(); ++i)
20+
v1[i] = i % 5;
21+
22+
cout << view::all(v1) << endl;
23+
24+
// std::generate() 를 이용한 방식
25+
// 컨테이너를 원하는 크기로 만들고, 내용을 채워넣을 방법을 지정한다. (사고의 흐름의 반대)
26+
int n = 0;
27+
vector<int> v2(15);
28+
std::generate(v2.begin(), v2.end(), [&n] {
29+
return n++ % 5;
30+
});
31+
32+
cout << view::all(v2) << endl;
33+
34+
// ranges 를 이용한 방식
35+
// 원하는 수열을 만들고, 그 수열로 컨테이너를 초기화한다. (사고의 흐름대로)
36+
vector<int> v3 =
37+
view::iota(0, 5) |
38+
view::cycle |
39+
view::take(15);
40+
41+
cout << view::all(v3) << endl;
42+
43+
// ranges 를 이용한 방식2
44+
// 원하는 수열을 만들고, 그 수열로 컨테이너를 초기화한다.
45+
auto quotient = [](int a, int b) {
46+
return a / 5 == b / 5;
47+
};
48+
49+
auto sum = [](auto rng) {
50+
return ranges::accumulate(rng, 0);
51+
};
52+
53+
vector<int> v4 = view::iota(0) |
54+
view::group_by(quotient) |
55+
view::transform(sum) |
56+
view::take(6);
57+
58+
cout << view::all(v4) << endl;
59+
//[10, 35, 60, 85, 110, 135]
60+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
#include<iostream>
2+
#include<vector>
3+
#include<range/v3/all.hpp>
4+
5+
using namespace ranges;
6+
using std::cout;
7+
using std::endl;
8+
9+
template <class T>
10+
struct TD;
11+
12+
int main()
13+
{
14+
// 1. iota | take
15+
auto rng0 = view::iota(0) |
16+
view::take(10);
17+
18+
cout << typeid(rng0).name() << endl;
19+
//struct ranges::v3::detail::take_exactly_view_<struct ranges::v3::iota_view<int,void>,0>
20+
21+
// 2. iota | cycle | take
22+
const auto rng1 = view::iota(0, 5) |
23+
view::cycle |
24+
view::take(15);
25+
26+
cout << typeid(rng1).name() << endl;
27+
// take_exactly_view_<cycled_view<take_exactly_view_<iota_view<int, void>, 1> >, 0>
28+
29+
// 3. iota | group_by | transform
30+
auto quotient = [](int a, int b) {
31+
return a / 5 == b / 5;
32+
};
33+
34+
auto sum = [](auto rng) {
35+
return ranges::accumulate(rng, 0);
36+
};
37+
38+
auto rng2 = view::iota(0, 15) |
39+
view::group_by(quotient) |
40+
view::transform(sum);
41+
42+
// 람다가 템플릿 파라미터로 사용된 타입에는 typeid() 비추
43+
//cout << typeid(rng2).name() << endl;
44+
//?AU?$transform_view@U?$group_by_view@U?$take_exactly_view_@U?$iota_view@HX@v3@ranges@@$00@detail@v3@ranges@@V<lambda_0>@?main@@9@@v3@ranges@@V<lambda_1>@?main@@9@@v3@ranges@@
45+
46+
// 대신 TypeDisplayer 로 타입 확인
47+
//TD<decltype(rng2)>();
48+
// error : implicit instantiation of undefined template
49+
// 'TD<transform_view<group_by_view<take_exactly_view_<iota_view<int, void>, true>,
50+
// (lambda at D:\생략\type_of_range.cpp:32:18)>, (lambda at D:\생략\type_of_range.cpp:36:13)> >'
51+
}

160528 - 2nd Seminar/Logo.png

298 KB
Loading

160528 - 2nd Seminar/README.md

+87
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
# C++ Korea 제2회 세미나 - "빠르게 변화하는 모던 C++에 몸을 맡겨라!"
2+
3+
###### 2016년 5월 28일에 진행되었던 C++ Korea 2회 세미나 발표 자료 및 예제 코드
4+
5+
<img src="./Logo.png">
6+
7+
## 프로그램
8+
9+
- 13:00 ~ 13:30 : 등록
10+
- 13:30 ~ 13:40 : C++ Korea 및 멜팅팟 세미나 소개
11+
- 13:40 ~ 14:10 : 세션 1 (May Microsoft be with C++ Developers)
12+
- 14:10 ~ 15:20 : 휴식
13+
- 14:20 ~ 15:20 : 세션 2 (C++17 Key Features Summary)
14+
- 15:20 ~ 15:30 : 휴식
15+
- 15:30 ~ 16:30 : 세션 3 (Ranges for The C++ Standard Library)
16+
- 16:30 ~ 16:40 : 휴식
17+
- 16:40 ~ 17:40 : 세션 4 (C++ String 파고들기)
18+
- 17:40 ~ 18:00 : 맺음말 & 경품 추첨
19+
20+
## 아젠다 및 발표자 소개
21+
22+
### 세션 1 - May Microsoft be with C++ Developers
23+
24+
그간 마이크로소프트는 모던 C++ 표준화의 노력과 더불어 Visual Studio를 중심으로 C++ 개발자들의 생산성을 높이기 위한 다양하고 편리한 기능을 제공하기 위해서 최선의 노력을 다하고 있습니다. 이번 세션에서는 C++ 개발자의 관점에서 Visual Studio에 신규로 추가된 주요 기능들을 Demo와 함께 알아보고자 합니다. C++ 개발자여, Microsoft와 함께 하시길!
25+
26+
#### 발표자
27+
28+
- 김명신.
29+
- 한국 마이크로소프트 부장, 기술 에반젤리스트
30+
- 전) Microsoft 동아시아 핵심 개발자 지원팀 수석
31+
- 저서
32+
- Advanced C Programming
33+
- Unix System V
34+
- 역서
35+
- 마스터링 Microsoft Azure IaaS
36+
- CLR via C#
37+
- Windows via C/C++
38+
- Effective C#
39+
40+
### 세션 2 - C++17 Key Features Summary
41+
42+
C++은 10년 만에 C++11/14를 발표하면서 '모던 C++'이라는 이름으로 발전했습니다. 그만큼 새로운 기능들이 많이 추가되었습니다. 그리고 2017년, C++은 C++17이라는 이름으로 또 한번의 발전을 준비하고 있습니다. 3년 주기로 빠르게 변화하는 모던 C++에 대비하기 위해 C++17에 추가될 주요 기능들을 살펴보고자 합니다.
43+
44+
#### 발표자
45+
46+
- 옥찬호. https://github.com/utilForever
47+
- Nexon Korea 클라이언트 프로그래머
48+
- Microsoft Visual C++ MVP
49+
- C++ Korea 그룹 대표
50+
- 역서
51+
- 게임샐러드로 코드 한 줄 없이 게임 만들기
52+
- 유니티 Shader와 Effect 제작
53+
- 2D 게임 프로그래밍
54+
55+
### 세션 3 - Ranges for The C++ Standard Library
56+
57+
데이터들 중 일부분을 나열하거나, 그룹 짓거나, 특정 데이터만 추출하거나, 데이터의 범위를 다루는 작업은 흔히 있는 일입니다. 그런데 하위 범위의 집합을 또 다른 범위로 표현해야 하는 상황이 생긴다면 어떻게 해야 될까요? 차기 C++ 표준에 포함될 예정인 Ranges Library를 통해 곧 사용하게 될 간결하고 효율적인 범위 표현에 대해 미리 알아봅니다.
58+
59+
#### 발표자
60+
61+
- 최동민.
62+
- Nexon Korea 서버 프로그래머
63+
64+
### 세션 4 - C++ String 파고들기
65+
66+
C++에서 가장 다루기 힘든 부분 중 하나가 바로 문자열일 것입니다. 특히 지역화(Localization)를 고려한 프로그램을 개발할 때에 살펴봐야 할 내용은 더욱 많아집니다. 이를 위해 모던 C++(C++11 ~ 17)에 추가된 다양한 문자열 지원 기능을 살펴보고, 표준에서 지원하지 않는 기능을 활용하기 위한 3rd party 라이브러리를 알아봅니다.
67+
68+
#### 발표자
69+
70+
- 허린.
71+
- NCSoft 서버 프로그래머
72+
- Microsoft Visual C++ MVP
73+
- C++로 게임 서버 개발중
74+
75+
## 안내
76+
77+
- 좌석이 한정되어 있으니 참석을 위해서는 반드시 사전등록을 해주시기 바랍니다.
78+
- 주차권은 지원되지 않습니다. 가급적 대중교통을 이용해주시기 바랍니다.
79+
- 간단한 다과와 음료가 제공됩니다.
80+
81+
## 협찬
82+
83+
- 한국 마이크로소프트
84+
- 한빛미디어
85+
- 에이콘출판사
86+
87+
행사 관련 문의는 [email protected] 으로 해주시기 바랍니다.

0 commit comments

Comments
 (0)