-
Notifications
You must be signed in to change notification settings - Fork 10
/
0057.txt
254 lines (254 loc) · 7.9 KB
/
0057.txt
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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
안녕하세요 포프입니다
오늘 비디오는 얼마전에 그
Rhea님이 트위터에서 했던 말로 시작하려고 해요
Rhea님이 물론 뭐
밤에 술 드시고 또
쓰신 트위터이긴한데
Rhea님이 이제 트위터에 그런 말씀을 하셨어요
C++11하고 C++14
14하고
c++17이 나오거든요
표준안인데
C++11은 굉장히 큰 변화였고
C++14은
그 뭐라고 그러죠
C++11에서 문제 있는것 좀 고치고
약간의 개선을 하고
C++17에서는 또 다시 엄청난
엄청난?
그
마이너한게 아닌 메이저한 체인지가 있을거에요
그래서
C++가 어떻게 보면은
옛날에 처음에는 몇 년도에 만들어졌는지
기억이 안나요 이젠
그건 만들어지고 나서
거의 변화가 없었잖아요
C++99가 조금 있었고
근데 뭐 그것도 크게 변환건 아니였고
그게 많이 쓰이지도 않았고
어떤 의미에선
그 뒤에
뭐
표준안이 변화가 없다가 최근 들어서
표준안이 3~4년에 한 번씩 계속 나오는 것이기 때문에
C#이 버전 1부터 5까지 계속 나왔듯이
그런식으로 계속 발전해 가는 언어가 되어가고 있거든요
Rhea 형님이 했던 말은 거기서
옛날에 C++ 옛날 방식 배워서
그걸로 10년 20년 우려먹으면서
아 우리는 C++ 고수야
이러고 있었는데
이제 조만간 그렇게 아무 발전 없이
옛날 것만 쓰고 요즘 것을 아예
무시하는 사람들 조만간
도태가 되고 발려버릴거라고
그런 얘기를 했었어요
그래서 뭐
그 정도 과격한 표현까지는 아니지만
C++
최신 기법 중에
최신 표준 중에 괜찮은 것들
몇 가지 보여서
제가 비디오도 만들었잖아요
제가 쓰는 c++11이라고
해서 음
오늘도 그 중에 하나를 소개시켜 드리려고 해요
일단 모르셨던 분들은 보고
아 이런게 있구나라고
라고 생각을 하고 쓰시면 될거 같고
저도 어떤 의미에서는 이제
최근에 들어서야 비주얼
스튜디오
2013
그 2013년 버전을 쓰기 시작했고
그 전에 2010년 버전을 썼거든요
그래서
최근 들어 조금씩 쓸 수 있는 기능들이 있어요
물론 아직도 constexpr는 좀 기다리고 있지만
그건 CTP버전으로만 나왔기
베타버전
아직 못 쓰고 있고
뭐든간에
아 오늘 제가 소개시켜로 하는
거는
Range-Based For라거 하는거에요
그 뭐냐면
그 for문 있잖아요
for문
그 for문에서
음 옛날에 for문 쓰면
for int i = i 는 g
i
=
i = 0 해놓고
뭐 i가 뭐부터 작을 때까지 ;하고
i++ 이렇게 썼잖아요
물론 그게 이제 auto를 쓰면
auto i로 대신 쓸 수 있었고
signed unsigned 때문에 또 에러나는 것도 있지만
warning 나는거
어쨌든 auto로 쓸 수 있었고
그게 이제
그게 아니면
이제 벡터나 뭐 이런거 쓰는 iterator라고 해서
STL 컨테이너쪽 쓰면은
iterator라고 해가지고
iterator 뭐
iterator : i 해놓고
무슨 뭐
vector.begin();
이 앞에 쓰는 것은
vector<?>::iterator
막 이렇게 쓰는거 있었잖아요
이건으 auto로 줄었으니깐
훨씬 간단해졌고
auto i = 어쩌고.begin() 해놓은 다음에
어쩌고 .end()까지
갈 때까지 ++i 해놓고
그런게 있었잖아요
그것을 좀 더 간단하게 쓸 수 있는 방법이 나왔어요
그러니깐
range하면 범위거든요
범위에 기반한 for loop에요
그러니깐 범위에 기반한다는게 뭐냐면
아까
vector를 예로 들었듯이
vector는 begin하고 end가 있잖아요
그래서 컴파일러는 이미 그 정보를
컴파일러라고 해야하나
런타임은 그 정보를 받아 갈 수 있기 때문에
for loop를 그냥
간단하게 쓰면은
컴파일 할 때 그 코드를
만들어줘서
알아서
지가 하겠다는 거에요
vector 예를 그대로 써보면
이 Range-Based For는 어떻게 쓰냐면
for를 하고요
원
아니 뭐야
소괄호
이걸 열어요
그 다음에
앞에 auto를
타입형으로 넣어주고
auto i
그러니깐 i가 이제 변수죠
i가 0부터 몇까지 가는 이런 개념으로
begin부터 end까지 가는거죠
여기에선
그리고
: 을 찍어요
; 이 아니라 : 을 찍고
그 옆에 그냥
vector형을 찍어줘요
그러니깐 vector가 v였다면
v를 그냥 찍어줘요
그런 이게 의미하는게 뭐냐면
그러면 괄호를 닫아요
닫고
그리고 밑에서 i 가지고 할 일을 다 하는거에요
이 개념이 뭐냐면
i 를 이 v안에 있는 각 요소들을
i 에 대입하면서 for loop를 돌리는거에요
한 마디로
i 를 begin으로 맞혀놓고
end까지 하면서 ++ 해주는거랑 똑같은거죠
그래서
코드를 짤 때는 정말 간단한 거에요
for (auto i : v)
끝이에요
vector v는 v
그리고 코드 안에서는
예전에 하던거랑 똑같이 하면 되고
한 가지 주의할 점은 이제
vector에서 큰 structure가 들어가 있을 때는
그것을 복사하긴 싫잖아요
그 경우에는 이제
auto 해놓고 앞에
&
그걸 꼽아주고
i 하면은 참조로 읽어오는거
그거 하나만 주의해주시면 되고
그래서 굉장히 편해요
그래서
저는 예전에도 말씀드렸듯이
말씀드렸나? 기억이 안나
블로그에 썼을 수 있어요
기억이 안나
근데
저는 vector보다는 array쪽을 많이 쓰는
써왔거든요
엔진쪽에서 많이 있었으니깐
그럼 array는 이걸 곧바로 쓸 수 있냐
원칙상은 없어요
원칙상은 없는데
그
뭐라고 그러지
왜냐면 런타임 중에
array는 배열
배열은
begin하고 end 함수가 없잖아요
포인터, 메모리 블럭
그게 전부이기 때문에
그래서 방법은 없는데
컴파일시에 그 배열 크기가 알려져 있으면
예를 들어서
요 for문 바로 올리기 전에
앞에 배열 하나 만들어 가지고
배열을 10개짜리를 해놨다
그러면 컴파일러는 이미 10개짜리 라는걸 알잖아요
그런 경우에는
이걸 해줄 수 있어요
그러니깐 auto i 해놓고
array가 a 였다 하면은
a 에 있는 각 요소마다 for loop를 돌려줘요
그것은 가능해요
그래서 몇 번은 써봤고
그것은 좋아요
그게 아니라 동적인 array를 하려면
방법이 있더라고 무슨 뭐 tuple 만들어가지고
뭐 array 시작하고 끝을
이렇게 만들어 가지고 넣어줘가지고 하는게 있는데
제가 볼 때는 그건 좀 너무 복잡한 것 같아요
오히려 코드가
그런 경우에는 차라리
for i = 0부터 counter까지 돌리면서
array 참조하는게 조금 더 나은거 같고
제 생각에는
그래서 구지 그것은 소개시켜드리고 싶지는 않은데
궁금하시면 찾아보시면 되요
그런 동적인 array도
가능해요
동적인 array
라고 하면 안 되지
array는 정적이니깐
size
컴파일시에 size를 모르는 array도 가능은 해요
근데 그걸 하려면
당연히 array 포인터는 있어야하고
array 포인터 외의
array 현재 들어간 요소가 몇개인지
count
그 값까지 있어야만 가능하더라요
그래서 하는 방법은 있어요
인터넷 찾아보시는데 저는 별로 추천하지는 않고
만약에 vector나 이쪽 쓰시는 분들은
그런 Range-Based For loop를 쓰시면
굉장히 코드 빠르고 쉽게 쓸 수 있고
static array
size가 이미 알려진 array은
그렇게 쓰셔도 상관이 없다
그 정도로 말씀드리고 싶고
제가 이걸 소개 시켜드리는 이유는
저도 잘 모르고 저도 잘 안 썼기 때문에
최근에서야 쓰기 시작 했기 떄문에
혹시나 안 쓰시는 분들이 있으면
이런게 있다
라고 하고
한 번 시도해보시라고요
굉장히 마음에 들어요 지금은
그러면 오늘도 C++ 얘기는 이만큼을 하고
포프였습니다