-
Notifications
You must be signed in to change notification settings - Fork 13
Expand file tree
/
Copy pathloops.html
More file actions
390 lines (327 loc) · 92.8 KB
/
loops.html
File metadata and controls
390 lines (327 loc) · 92.8 KB
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
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
<!DOCTYPE html>
<html lang="en-US">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>C++ | Loops</title>
<meta name="generator" content="VuePress 1.8.2">
<link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png">
<link rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.png">
<link rel="manifest" href="/site.webmanifest">
<link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png">
<link rel="mask-icon" href="/safari-pinned-tab.svg" color="#5bbad5">
<meta name="description" content="Range-Based For, For loop, While loop, Do-while loop, Loop Control statements : Break and Continue, Declaration of variables in conditions, Range-for over a sub-range">
<meta property="og:site_name" content="DevTut">
<meta property="og:title" content="C++ | Loops">
<meta property="og:description" content="Range-Based For, For loop, While loop, Do-while loop, Loop Control statements : Break and Continue, Declaration of variables in conditions, Range-for over a sub-range">
<meta property="og:type" content="article">
<meta property="og:url" content="/cpp/loops.html">
<meta property="og:image" content="/logo.png">
<meta name="twitter:title" content="C++ | Loops">
<meta name="twitter:description" content="Range-Based For, For loop, While loop, Do-while loop, Loop Control statements : Break and Continue, Declaration of variables in conditions, Range-for over a sub-range">
<meta name="twitter:url" content="/cpp/loops.html">
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:image" content="/logo.png">
<meta name="theme-color" content="#ffffff">
<meta name="apple-mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-status-bar-style" content="black">
<meta name="msapplication-TileImage" content="/mstile-150x150.png">
<meta name="msapplication-TileColor" content="#da532c">
<meta name="google-site-verification" content="76_rKXgwMVIjd-axJC_1zPV9OS4mEjvtgjYOWVkAdnQ">
<link rel="preload" href="/assets/css/0.styles.60619e34.css" as="style"><link rel="preload" href="/assets/js/app.1779e102.js" as="script"><link rel="preload" href="/assets/js/3.2cfa8016.js" as="script"><link rel="preload" href="/assets/js/673.f17e9288.js" as="script">
<link rel="stylesheet" href="/assets/css/0.styles.60619e34.css">
</head>
<body>
<div id="app" data-server-rendered="true"><div class="theme-container"><header class="navbar"><div class="sidebar-button"><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" role="img" viewBox="0 0 448 512" class="icon"><path fill="currentColor" d="M436 124H12c-6.627 0-12-5.373-12-12V80c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12zm0 160H12c-6.627 0-12-5.373-12-12v-32c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12zm0 160H12c-6.627 0-12-5.373-12-12v-32c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12z"></path></svg></div> <a href="/" class="home-link router-link-active"><!----> <span class="site-name">DevTut</span></a> <div class="links"><form id="search-form" role="search" class="algolia-search-wrapper search-box"><input id="algolia-search-input" class="search-query"></form> <nav class="nav-links can-hide"> <a href="https://github.com/devtut/generate" target="_blank" rel="noopener noreferrer" class="repo-link">
GitHub
<span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a></nav></div></header> <div class="sidebar-mask"></div> <aside class="sidebar"><nav class="nav-links"> <a href="https://github.com/devtut/generate" target="_blank" rel="noopener noreferrer" class="repo-link">
GitHub
<span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a></nav> <ul class="sidebar-links"><li><section class="sidebar-group depth-0"><p class="sidebar-heading open"><span>C++</span> <!----></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/cpp/" aria-current="page" class="sidebar-link">Disclaimer</a></li><li><a href="/cpp/getting-started-with-cpp.html" class="sidebar-link">Getting started with C++</a></li><li><a href="/cpp/literals.html" class="sidebar-link">Literals</a></li><li><a href="/cpp/operator-precedence.html" class="sidebar-link">operator precedence</a></li><li><a href="/cpp/floating-point-arithmetic.html" class="sidebar-link">Floating Point Arithmetic</a></li><li><a href="/cpp/bit-operators.html" class="sidebar-link">Bit Operators</a></li><li><a href="/cpp/bit-manipulation.html" class="sidebar-link">Bit Manipulation</a></li><li><a href="/cpp/bit-fields.html" class="sidebar-link">Bit fields</a></li><li><a href="/cpp/arrays.html" class="sidebar-link">Arrays</a></li><li><a href="/cpp/iterators.html" class="sidebar-link">Iterators</a></li><li><a href="/cpp/basic-input-output-in-c.html" class="sidebar-link">Basic input/output in c++</a></li><li><a href="/cpp/loops.html" aria-current="page" class="active sidebar-link">Loops</a><ul class="sidebar-sub-headers"><li class="sidebar-sub-header"><a href="/cpp/loops.html#range-based-for" class="sidebar-link">Range-Based For</a></li><li class="sidebar-sub-header"><a href="/cpp/loops.html#for-loop" class="sidebar-link">For loop</a></li><li class="sidebar-sub-header"><a href="/cpp/loops.html#while-loop" class="sidebar-link">While loop</a></li><li class="sidebar-sub-header"><a href="/cpp/loops.html#do-while-loop" class="sidebar-link">Do-while loop</a></li><li class="sidebar-sub-header"><a href="/cpp/loops.html#loop-control-statements-break-and-continue" class="sidebar-link">Loop Control statements : Break and Continue</a></li><li class="sidebar-sub-header"><a href="/cpp/loops.html#declaration-of-variables-in-conditions" class="sidebar-link">Declaration of variables in conditions</a></li><li class="sidebar-sub-header"><a href="/cpp/loops.html#range-for-over-a-sub-range" class="sidebar-link">Range-for over a sub-range</a></li></ul></li><li><a href="/cpp/file-i-o.html" class="sidebar-link">File I/O</a></li><li><a href="/cpp/cpp-streams.html" class="sidebar-link">C++ Streams</a></li><li><a href="/cpp/stream-manipulators.html" class="sidebar-link">Stream manipulators</a></li><li><a href="/cpp/flow-control.html" class="sidebar-link">Flow Control</a></li><li><a href="/cpp/metaprogramming.html" class="sidebar-link">Metaprogramming</a></li><li><a href="/cpp/const-keyword.html" class="sidebar-link">const keyword</a></li><li><a href="/cpp/mutable-keyword.html" class="sidebar-link">mutable keyword</a></li><li><a href="/cpp/friend-keyword.html" class="sidebar-link">Friend keyword</a></li><li><a href="/cpp/type-keywords.html" class="sidebar-link">Type Keywords</a></li><li><a href="/cpp/basic-type-keywords.html" class="sidebar-link">Basic Type Keywords</a></li><li><a href="/cpp/variable-declaration-keywords.html" class="sidebar-link">Variable Declaration Keywords</a></li><li><a href="/cpp/keywords.html" class="sidebar-link">Keywords</a></li><li><a href="/cpp/returning-several-values-from-a-function.html" class="sidebar-link">Returning several values from a function</a></li><li><a href="/cpp/polymorphism.html" class="sidebar-link">Polymorphism</a></li><li><a href="/cpp/references.html" class="sidebar-link">References</a></li><li><a href="/cpp/value-and-reference-semantics.html" class="sidebar-link">Value and Reference Semantics</a></li><li><a href="/cpp/c-function-call-by-value-vs-call-by-reference.html" class="sidebar-link">C++ function "call by value" vs. "call by reference"</a></li><li><a href="/cpp/copying-vs-assignment.html" class="sidebar-link">Copying vs Assignment</a></li><li><a href="/cpp/pointers.html" class="sidebar-link">Pointers</a></li><li><a href="/cpp/pointers-to-members.html" class="sidebar-link">Pointers to members</a></li><li><a href="/cpp/the-this-pointer.html" class="sidebar-link">The This Pointer</a></li><li><a href="/cpp/smart-pointers.html" class="sidebar-link">Smart Pointers</a></li><li><a href="/cpp/classes-structures.html" class="sidebar-link">Classes/Structures</a></li><li><a href="/cpp/function-overloading.html" class="sidebar-link">Function Overloading</a></li><li><a href="/cpp/operator-overloading.html" class="sidebar-link">Operator Overloading</a></li><li><a href="/cpp/function-template-overloading.html" class="sidebar-link">Function Template Overloading</a></li><li><a href="/cpp/virtual-member-functions.html" class="sidebar-link">Virtual Member Functions</a></li><li><a href="/cpp/inline-functions.html" class="sidebar-link">Inline functions</a></li><li><a href="/cpp/special-member-functions.html" class="sidebar-link">Special Member Functions</a></li><li><a href="/cpp/non-static-member-functions.html" class="sidebar-link">Non-Static Member Functions</a></li><li><a href="/cpp/constant-class-member-functions.html" class="sidebar-link">Constant class member functions</a></li><li><a href="/cpp/c-containers.html" class="sidebar-link">C++ Containers</a></li><li><a href="/cpp/namespaces.html" class="sidebar-link">Namespaces</a></li><li><a href="/cpp/header-files.html" class="sidebar-link">Header Files</a></li><li><a href="/cpp/using-declaration.html" class="sidebar-link">Using declaration</a></li><li><a href="/cpp/std-string.html" class="sidebar-link">std::string</a></li><li><a href="/cpp/std-array.html" class="sidebar-link">std::array</a></li><li><a href="/cpp/std-vector.html" class="sidebar-link">std::vector</a></li><li><a href="/cpp/std-map.html" class="sidebar-link">std::map</a></li><li><a href="/cpp/std-optional.html" class="sidebar-link">std::optional</a></li><li><a href="/cpp/std-function-to-wrap-any-element-that-is-callable.html" class="sidebar-link">std::function: To wrap any element that is callable</a></li><li><a href="/cpp/std-forward-list.html" class="sidebar-link">std::forward_list</a></li><li><a href="/cpp/std-pair.html" class="sidebar-link">std::pair</a></li><li><a href="/cpp/std-atomics.html" class="sidebar-link">std::atomics</a></li><li><a href="/cpp/std-variant.html" class="sidebar-link">std::variant</a></li><li><a href="/cpp/std-iomanip.html" class="sidebar-link">std::iomanip</a></li><li><a href="/cpp/std-any.html" class="sidebar-link">std::any</a></li><li><a href="/cpp/std-set-and-std-multiset.html" class="sidebar-link">std::set and std::multiset</a></li><li><a href="/cpp/std-integer-sequence.html" class="sidebar-link">std::integer_sequence</a></li><li><a href="/cpp/using-std-unordered-map.html" class="sidebar-link">Using std::unordered_map</a></li><li><a href="/cpp/standard-library-algorithms.html" class="sidebar-link">Standard Library Algorithms</a></li><li><a href="/cpp/the-iso-c-standard.html" class="sidebar-link">The ISO C++ Standard</a></li><li><a href="/cpp/inline-variables.html" class="sidebar-link">Inline variables</a></li><li><a href="/cpp/random-number-generation.html" class="sidebar-link">Random number generation</a></li><li><a href="/cpp/date-and-time-using-chrono-header.html" class="sidebar-link">Date and time using header</a></li><li><a href="/cpp/sorting.html" class="sidebar-link">Sorting</a></li><li><a href="/cpp/enumeration.html" class="sidebar-link">Enumeration</a></li><li><a href="/cpp/iteration.html" class="sidebar-link">Iteration</a></li><li><a href="/cpp/regular-expressions.html" class="sidebar-link">Regular expressions</a></li><li><a href="/cpp/implementation-defined-behavior.html" class="sidebar-link">Implementation-defined behavior</a></li><li><a href="/cpp/exceptions.html" class="sidebar-link">Exceptions</a></li><li><a href="/cpp/lambdas.html" class="sidebar-link">Lambdas</a></li><li><a href="/cpp/value-categories.html" class="sidebar-link">Value Categories</a></li><li><a href="/cpp/preprocessor.html" class="sidebar-link">Preprocessor</a></li><li><a href="/cpp/data-structures-in-c.html" class="sidebar-link">Data Structures in C++</a></li><li><a href="/cpp/templates.html" class="sidebar-link">Templates</a></li><li><a href="/cpp/expression-templates.html" class="sidebar-link">Expression templates</a></li><li><a href="/cpp/curiously-recurring-template-pattern-crtp.html" class="sidebar-link">Curiously Recurring Template Pattern (CRTP)</a></li><li><a href="/cpp/threading.html" class="sidebar-link">Threading</a></li><li><a href="/cpp/thread-synchronization-structures.html" class="sidebar-link">Thread synchronization structures</a></li><li><a href="/cpp/the-rule-of-three-five-and-zero.html" class="sidebar-link">The Rule of Three, Five, And Zero</a></li><li><a href="/cpp/raii-resource-acquisition-is-initialization.html" class="sidebar-link">RAII: Resource Acquisition Is Initialization</a></li><li><a href="/cpp/rtti-run-time-type-information.html" class="sidebar-link">RTTI: Run-Time Type Information</a></li><li><a href="/cpp/mutexes.html" class="sidebar-link">Mutexes</a></li><li><a href="/cpp/recursive-mutex.html" class="sidebar-link">Recursive Mutex</a></li><li><a href="/cpp/semaphore.html" class="sidebar-link">Semaphore</a></li><li><a href="/cpp/futures-and-promises.html" class="sidebar-link">Futures and Promises</a></li><li><a href="/cpp/atomic-types.html" class="sidebar-link">Atomic Types</a></li><li><a href="/cpp/type-erasure.html" class="sidebar-link">Type Erasure</a></li><li><a href="/cpp/explicit-type-conversions.html" class="sidebar-link">Explicit type conversions</a></li><li><a href="/cpp/unnamed-types.html" class="sidebar-link">Unnamed types</a></li><li><a href="/cpp/type-traits.html" class="sidebar-link">Type Traits</a></li><li><a href="/cpp/return-type-covariance.html" class="sidebar-link">Return Type Covariance</a></li><li><a href="/cpp/layout-of-object-types.html" class="sidebar-link">Layout of object types</a></li><li><a href="/cpp/type-inference.html" class="sidebar-link">Type Inference</a></li><li><a href="/cpp/typedef-and-type-aliases.html" class="sidebar-link">Typedef and type aliases</a></li><li><a href="/cpp/type-deduction.html" class="sidebar-link">type deduction</a></li><li><a href="/cpp/trailing-return-type.html" class="sidebar-link">Trailing return type</a></li><li><a href="/cpp/alignment.html" class="sidebar-link">Alignment</a></li><li><a href="/cpp/perfect-forwarding.html" class="sidebar-link">Perfect Forwarding</a></li><li><a href="/cpp/decltype.html" class="sidebar-link">decltype</a></li><li><a href="/cpp/sfinae-substitution-failure-is-not-an-error.html" class="sidebar-link">SFINAE (Substitution Failure Is Not An Error)</a></li><li><a href="/cpp/undefined-behavior.html" class="sidebar-link">Undefined Behavior</a></li><li><a href="/cpp/overload-resolution.html" class="sidebar-link">Overload resolution</a></li><li><a href="/cpp/move-semantics.html" class="sidebar-link">Move Semantics</a></li><li><a href="/cpp/pimpl-idiom.html" class="sidebar-link">Pimpl Idiom</a></li><li><a href="/cpp/auto.html" class="sidebar-link">auto</a></li><li><a href="/cpp/copy-elision.html" class="sidebar-link">Copy Elision</a></li><li><a href="/cpp/fold-expressions.html" class="sidebar-link">Fold Expressions</a></li><li><a href="/cpp/unions.html" class="sidebar-link">Unions</a></li><li><a href="/cpp/design-pattern-implementation-in-c.html" class="sidebar-link">Design pattern implementation in C++</a></li><li><a href="/cpp/singleton-design-pattern.html" class="sidebar-link">Singleton Design Pattern</a></li><li><a href="/cpp/user-defined-literals.html" class="sidebar-link">User-Defined Literals</a></li><li><a href="/cpp/memory-management.html" class="sidebar-link">Memory management</a></li><li><a href="/cpp/c-11-memory-model.html" class="sidebar-link">C++11 Memory Model</a></li><li><a href="/cpp/scopes.html" class="sidebar-link">Scopes</a></li><li><a href="/cpp/static-assert.html" class="sidebar-link">static_assert</a></li><li><a href="/cpp/constexpr.html" class="sidebar-link">constexpr</a></li><li><a href="/cpp/one-definition-rule-odr.html" class="sidebar-link">One Definition Rule (ODR)</a></li><li><a href="/cpp/unspecified-behavior.html" class="sidebar-link">Unspecified behavior</a></li><li><a href="/cpp/argument-dependent-name-lookup.html" class="sidebar-link">Argument Dependent Name Lookup</a></li><li><a href="/cpp/attributes.html" class="sidebar-link">Attributes</a></li><li><a href="/cpp/recursion-in-c.html" class="sidebar-link">Recursion in C++</a></li><li><a href="/cpp/arithmitic-metaprogramming.html" class="sidebar-link">Arithmitic Metaprogramming</a></li><li><a href="/cpp/callable-objects.html" class="sidebar-link">Callable Objects</a></li><li><a href="/cpp/client-server-examples.html" class="sidebar-link">Client server examples</a></li><li><a href="/cpp/const-correctness.html" class="sidebar-link">Const Correctness</a></li><li><a href="/cpp/parameter-packs.html" class="sidebar-link">Parameter packs</a></li><li><a href="/cpp/build-systems.html" class="sidebar-link">Build Systems</a></li><li><a href="/cpp/concurrency-with-openmp.html" class="sidebar-link">Concurrency With OpenMP</a></li><li><a href="/cpp/resource-management.html" class="sidebar-link">Resource Management</a></li><li><a href="/cpp/storage-class-specifiers.html" class="sidebar-link">Storage class specifiers</a></li><li><a href="/cpp/linkage-specifications.html" class="sidebar-link">Linkage specifications</a></li><li><a href="/cpp/digit-separators.html" class="sidebar-link">Digit separators</a></li><li><a href="/cpp/c-incompatibilities.html" class="sidebar-link">C incompatibilities</a></li><li><a href="/cpp/side-by-side-comparisons-of-classic-c-examples-solved-via-c-vs-c-11-vs-c-14-vs-c-17.html" class="sidebar-link">Side by Side Comparisons of classic C++ examples solved via C++ vs C++11 vs C++14 vs C++17</a></li><li><a href="/cpp/compiling-and-building.html" class="sidebar-link">Compiling and Building</a></li><li><a href="/cpp/common-compile-linker-errors-gcc.html" class="sidebar-link">Common compile/linker errors (GCC)</a></li><li><a href="/cpp/more-undefined-behaviors-in-c.html" class="sidebar-link">More undefined behaviors in C++</a></li><li><a href="/cpp/unit-testing-in-c.html" class="sidebar-link">Unit Testing in C++</a></li><li><a href="/cpp/c-debugging-and-debug-prevention-tools-techniques.html" class="sidebar-link">C++ Debugging and Debug-prevention Tools & Techniques</a></li><li><a href="/cpp/optimization-in-c.html" class="sidebar-link">Optimization in C++</a></li><li><a href="/cpp/optimization.html" class="sidebar-link">Optimization</a></li><li><a href="/cpp/profiling.html" class="sidebar-link">Profiling</a></li><li><a href="/cpp/refactoring-techniques.html" class="sidebar-link">Refactoring Techniques</a></li><li><a href="/cpp/internationalization-in-c.html" class="sidebar-link">Internationalization in C++</a></li><li><a href="/cpp/contributors.html" class="sidebar-link">The Contributors</a></li></ul></section></li></ul> </aside> <main class="page"> <div class="theme-default-content content__default"><h1 id="loops"><a href="#loops" class="header-anchor">#</a> Loops</h1> <p>A loop statement executes a group of statements repeatedly until a condition is met.
There are 3 types of primitive loops in C++: for, while, and do...while.</p> <h2 id="range-based-for"><a href="#range-based-for" class="header-anchor">#</a> Range-Based For</h2> <p><code>for</code> loops can be used to iterate over the elements of a iterator-based range, without using a numeric index or directly accessing the iterators:</p> <div class="language-cpp extra-class"><pre class="language-cpp"><code>vector<span class="token operator"><</span><span class="token keyword">float</span><span class="token operator">></span> v <span class="token operator">=</span> <span class="token punctuation">{</span><span class="token number">0.4f</span><span class="token punctuation">,</span> <span class="token number">12.5f</span><span class="token punctuation">,</span> <span class="token number">16.234f</span><span class="token punctuation">}</span><span class="token punctuation">;</span>
<span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">auto</span> val<span class="token operator">:</span> v<span class="token punctuation">)</span>
<span class="token punctuation">{</span>
std<span class="token double-colon punctuation">::</span>cout <span class="token operator"><<</span> val <span class="token operator"><<</span> <span class="token string">" "</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
std<span class="token double-colon punctuation">::</span>cout <span class="token operator"><<</span> std<span class="token double-colon punctuation">::</span>endl<span class="token punctuation">;</span>
</code></pre></div><p>This will iterate over every element in <code>v</code>, with <code>val</code> getting the value of the current element. The following statement:</p> <div class="language-cpp extra-class"><pre class="language-cpp"><code><span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">for</span><span class="token operator">-</span>range<span class="token operator">-</span>declaration <span class="token operator">:</span> <span class="token keyword">for</span><span class="token operator">-</span>range<span class="token operator">-</span>initializer <span class="token punctuation">)</span> statement
</code></pre></div><p>is equivalent to:</p> <div class="language-cpp extra-class"><pre class="language-cpp"><code><span class="token punctuation">{</span>
<span class="token keyword">auto</span><span class="token operator">&&</span> __range <span class="token operator">=</span> <span class="token keyword">for</span><span class="token operator">-</span>range<span class="token operator">-</span>initializer<span class="token punctuation">;</span>
<span class="token keyword">auto</span> __begin <span class="token operator">=</span> begin<span class="token operator">-</span>expr<span class="token punctuation">,</span> __end <span class="token operator">=</span> end<span class="token operator">-</span>expr<span class="token punctuation">;</span>
<span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token punctuation">;</span> __begin <span class="token operator">!=</span> __end<span class="token punctuation">;</span> <span class="token operator">++</span>__begin<span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">for</span><span class="token operator">-</span>range<span class="token operator">-</span>declaration <span class="token operator">=</span> <span class="token operator">*</span>__begin<span class="token punctuation">;</span>
statement
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
</code></pre></div><div class="language-cpp extra-class"><pre class="language-cpp"><code><span class="token punctuation">{</span>
<span class="token keyword">auto</span><span class="token operator">&&</span> __range <span class="token operator">=</span> <span class="token keyword">for</span><span class="token operator">-</span>range<span class="token operator">-</span>initializer<span class="token punctuation">;</span>
<span class="token keyword">auto</span> __begin <span class="token operator">=</span> begin<span class="token operator">-</span>expr<span class="token punctuation">;</span>
<span class="token keyword">auto</span> __end <span class="token operator">=</span> end<span class="token operator">-</span>expr<span class="token punctuation">;</span> <span class="token comment">// end is allowed to be a different type than begin in C++17</span>
<span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token punctuation">;</span> __begin <span class="token operator">!=</span> __end<span class="token punctuation">;</span> <span class="token operator">++</span>__begin<span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">for</span><span class="token operator">-</span>range<span class="token operator">-</span>declaration <span class="token operator">=</span> <span class="token operator">*</span>__begin<span class="token punctuation">;</span>
statement
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
</code></pre></div><p>This change was introduced for the planned support of Ranges TS in C++20.</p> <p>In this case, our loop is equivalent to:</p> <div class="language-cpp extra-class"><pre class="language-cpp"><code><span class="token punctuation">{</span>
<span class="token keyword">auto</span><span class="token operator">&&</span> __range <span class="token operator">=</span> v<span class="token punctuation">;</span>
<span class="token keyword">auto</span> __begin <span class="token operator">=</span> v<span class="token punctuation">.</span><span class="token function">begin</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> __end <span class="token operator">=</span> v<span class="token punctuation">.</span><span class="token function">end</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token punctuation">;</span> __begin <span class="token operator">!=</span> __end<span class="token punctuation">;</span> <span class="token operator">++</span>__begin<span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">auto</span> val <span class="token operator">=</span> <span class="token operator">*</span>__begin<span class="token punctuation">;</span>
std<span class="token double-colon punctuation">::</span>cout <span class="token operator"><<</span> val <span class="token operator"><<</span> <span class="token string">" "</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
</code></pre></div><p>Note that <code>auto val</code> declares a value type, which will be a copy of a value stored in the range (we are copy-initializing it from the iterator as we go). If the values stored in the range are expensive to copy, you may want to use <code>const auto &val</code>. You are also not required to use <code>auto</code>; you can use an appropriate typename, so long as it is implicitly convertible from the range's value type.</p> <p>If you need access to the iterator, range-based for cannot help you (not without some effort, at least).</p> <p>If you wish to reference it, you may do so:</p> <div class="language-cpp extra-class"><pre class="language-cpp"><code>vector<span class="token operator"><</span><span class="token keyword">float</span><span class="token operator">></span> v <span class="token operator">=</span> <span class="token punctuation">{</span><span class="token number">0.4f</span><span class="token punctuation">,</span> <span class="token number">12.5f</span><span class="token punctuation">,</span> <span class="token number">16.234f</span><span class="token punctuation">}</span><span class="token punctuation">;</span>
<span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">float</span> <span class="token operator">&</span>val<span class="token operator">:</span> v<span class="token punctuation">)</span>
<span class="token punctuation">{</span>
std<span class="token double-colon punctuation">::</span>cout <span class="token operator"><<</span> val <span class="token operator"><<</span> <span class="token string">" "</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
</code></pre></div><p>You could iterate on <code>const</code> reference if you have <code>const</code> container:</p> <div class="language-cpp extra-class"><pre class="language-cpp"><code><span class="token keyword">const</span> vector<span class="token operator"><</span><span class="token keyword">float</span><span class="token operator">></span> v <span class="token operator">=</span> <span class="token punctuation">{</span><span class="token number">0.4f</span><span class="token punctuation">,</span> <span class="token number">12.5f</span><span class="token punctuation">,</span> <span class="token number">16.234f</span><span class="token punctuation">}</span><span class="token punctuation">;</span>
<span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">const</span> <span class="token keyword">float</span> <span class="token operator">&</span>val<span class="token operator">:</span> v<span class="token punctuation">)</span>
<span class="token punctuation">{</span>
std<span class="token double-colon punctuation">::</span>cout <span class="token operator"><<</span> val <span class="token operator"><<</span> <span class="token string">" "</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
</code></pre></div><p>One would use forwarding references when the sequence iterator returns a proxy object and you need to operate on that object in a non-<code>const</code> way. Note: it will most likely confuse readers of your code.</p> <div class="language-cpp extra-class"><pre class="language-cpp"><code>vector<span class="token operator"><</span><span class="token keyword">bool</span><span class="token operator">></span> <span class="token function">v</span><span class="token punctuation">(</span><span class="token number">10</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">auto</span><span class="token operator">&&</span> val<span class="token operator">:</span> v<span class="token punctuation">)</span>
<span class="token punctuation">{</span>
val <span class="token operator">=</span> <span class="token boolean">true</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
</code></pre></div><p>The "range" type provided to range-based <code>for</code> can be one of the following:</p> <li>
Language arrays:
<div class="language-cpp extra-class"><pre class="language-cpp"><code><span class="token keyword">float</span> arr<span class="token punctuation">[</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token punctuation">{</span><span class="token number">0.4f</span><span class="token punctuation">,</span> <span class="token number">12.5f</span><span class="token punctuation">,</span> <span class="token number">16.234f</span><span class="token punctuation">}</span><span class="token punctuation">;</span>
<span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">auto</span> val<span class="token operator">:</span> arr<span class="token punctuation">)</span>
<span class="token punctuation">{</span>
std<span class="token double-colon punctuation">::</span>cout <span class="token operator"><<</span> val <span class="token operator"><<</span> <span class="token string">" "</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
</code></pre></div><p>Note that allocating a dynamic array does not count:</p> <div class="language-cpp extra-class"><pre class="language-cpp"><code><span class="token keyword">float</span> <span class="token operator">*</span>arr <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token keyword">float</span><span class="token punctuation">[</span><span class="token number">3</span><span class="token punctuation">]</span><span class="token punctuation">{</span><span class="token number">0.4f</span><span class="token punctuation">,</span> <span class="token number">12.5f</span><span class="token punctuation">,</span> <span class="token number">16.234f</span><span class="token punctuation">}</span><span class="token punctuation">;</span>
<span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">auto</span> val<span class="token operator">:</span> arr<span class="token punctuation">)</span> <span class="token comment">//Compile error.</span>
<span class="token punctuation">{</span>
std<span class="token double-colon punctuation">::</span>cout <span class="token operator"><<</span> val <span class="token operator"><<</span> <span class="token string">" "</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
</code></pre></div></li> <li>
Any type which has member functions `begin()` and `end()`, which return iterators to the elements of the type. The standard library containers qualify, but user-defined types can be used as well:
<div class="language-cpp extra-class"><pre class="language-cpp"><code><span class="token keyword">struct</span> <span class="token class-name">Rng</span>
<span class="token punctuation">{</span>
<span class="token keyword">float</span> arr<span class="token punctuation">[</span><span class="token number">3</span><span class="token punctuation">]</span><span class="token punctuation">;</span>
<span class="token comment">// pointers are iterators</span>
<span class="token keyword">const</span> <span class="token keyword">float</span><span class="token operator">*</span> <span class="token function">begin</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">const</span> <span class="token punctuation">{</span><span class="token keyword">return</span> <span class="token operator">&</span>arr<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">;</span><span class="token punctuation">}</span>
<span class="token keyword">const</span> <span class="token keyword">float</span><span class="token operator">*</span> <span class="token function">end</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">const</span> <span class="token punctuation">{</span><span class="token keyword">return</span> <span class="token operator">&</span>arr<span class="token punctuation">[</span><span class="token number">3</span><span class="token punctuation">]</span><span class="token punctuation">;</span><span class="token punctuation">}</span>
<span class="token keyword">float</span><span class="token operator">*</span> <span class="token function">begin</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><span class="token keyword">return</span> <span class="token operator">&</span>arr<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">;</span><span class="token punctuation">}</span>
<span class="token keyword">float</span><span class="token operator">*</span> <span class="token function">end</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><span class="token keyword">return</span> <span class="token operator">&</span>arr<span class="token punctuation">[</span><span class="token number">3</span><span class="token punctuation">]</span><span class="token punctuation">;</span><span class="token punctuation">}</span>
<span class="token punctuation">}</span><span class="token punctuation">;</span>
<span class="token keyword">int</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
Rng rng <span class="token operator">=</span> <span class="token punctuation">{</span><span class="token punctuation">{</span><span class="token number">0.4f</span><span class="token punctuation">,</span> <span class="token number">12.5f</span><span class="token punctuation">,</span> <span class="token number">16.234f</span><span class="token punctuation">}</span><span class="token punctuation">}</span><span class="token punctuation">;</span>
<span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">auto</span> val<span class="token operator">:</span> rng<span class="token punctuation">)</span>
<span class="token punctuation">{</span>
std<span class="token double-colon punctuation">::</span>cout <span class="token operator"><<</span> val <span class="token operator"><<</span> <span class="token string">" "</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
</code></pre></div></li> <li>
Any type which has non-member `begin(type)` and `end(type)` functions which can found via argument dependent lookup, based on `type`. This is useful for creating a range type without having to modify class type itself:
<div class="language-cpp extra-class"><pre class="language-cpp"><code><span class="token keyword">namespace</span> Mine
<span class="token punctuation">{</span>
<span class="token keyword">struct</span> <span class="token class-name">Rng</span> <span class="token punctuation">{</span><span class="token keyword">float</span> arr<span class="token punctuation">[</span><span class="token number">3</span><span class="token punctuation">]</span><span class="token punctuation">;</span><span class="token punctuation">}</span><span class="token punctuation">;</span>
<span class="token comment">// pointers are iterators</span>
<span class="token keyword">const</span> <span class="token keyword">float</span><span class="token operator">*</span> <span class="token function">begin</span><span class="token punctuation">(</span><span class="token keyword">const</span> Rng <span class="token operator">&</span>rng<span class="token punctuation">)</span> <span class="token punctuation">{</span><span class="token keyword">return</span> <span class="token operator">&</span>rng<span class="token punctuation">.</span>arr<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">;</span><span class="token punctuation">}</span>
<span class="token keyword">const</span> <span class="token keyword">float</span><span class="token operator">*</span> <span class="token function">end</span><span class="token punctuation">(</span><span class="token keyword">const</span> Rng <span class="token operator">&</span>rng<span class="token punctuation">)</span> <span class="token punctuation">{</span><span class="token keyword">return</span> <span class="token operator">&</span>rng<span class="token punctuation">.</span>arr<span class="token punctuation">[</span><span class="token number">3</span><span class="token punctuation">]</span><span class="token punctuation">;</span><span class="token punctuation">}</span>
<span class="token keyword">float</span><span class="token operator">*</span> <span class="token function">begin</span><span class="token punctuation">(</span>Rng <span class="token operator">&</span>rng<span class="token punctuation">)</span> <span class="token punctuation">{</span><span class="token keyword">return</span> <span class="token operator">&</span>rng<span class="token punctuation">.</span>arr<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">;</span><span class="token punctuation">}</span>
<span class="token keyword">float</span><span class="token operator">*</span> <span class="token function">end</span><span class="token punctuation">(</span>Rng <span class="token operator">&</span>rng<span class="token punctuation">)</span> <span class="token punctuation">{</span><span class="token keyword">return</span> <span class="token operator">&</span>rng<span class="token punctuation">.</span>arr<span class="token punctuation">[</span><span class="token number">3</span><span class="token punctuation">]</span><span class="token punctuation">;</span><span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token keyword">int</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
Mine<span class="token double-colon punctuation">::</span>Rng rng <span class="token operator">=</span> <span class="token punctuation">{</span><span class="token punctuation">{</span><span class="token number">0.4f</span><span class="token punctuation">,</span> <span class="token number">12.5f</span><span class="token punctuation">,</span> <span class="token number">16.234f</span><span class="token punctuation">}</span><span class="token punctuation">}</span><span class="token punctuation">;</span>
<span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">auto</span> val<span class="token operator">:</span> rng<span class="token punctuation">)</span>
<span class="token punctuation">{</span>
std<span class="token double-colon punctuation">::</span>cout <span class="token operator"><<</span> val <span class="token operator"><<</span> <span class="token string">" "</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
</code></pre></div></li> <h2 id="for-loop"><a href="#for-loop" class="header-anchor">#</a> For loop</h2> <p>A <code>for</code> loop executes statements in the <code>loop body</code>, while the loop <code>condition</code> is true. Before the loop <code>initialization statement</code> is executed exactly once. After each cycle, the <code>iteration execution</code> part is executed.</p> <p>A <code>for</code> loop is defined as follows:</p> <div class="language-cpp extra-class"><pre class="language-cpp"><code><span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token comment">/*initialization statement*/</span><span class="token punctuation">;</span> <span class="token comment">/*condition*/</span><span class="token punctuation">;</span> <span class="token comment">/*iteration execution*/</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token comment">// body of the loop</span>
<span class="token punctuation">}</span>
</code></pre></div><p>Explanation of the placeholder statements:</p> <ul><li><code>initialization statement</code>: This statement gets executed only once, at the beginning of the <code>for</code> loop. You can enter a declaration of multiple variables of one type, such as <code>int i = 0, a = 2, b = 3</code>. These variables are only valid in the scope of the loop. Variables defined before the loop with the same name are hidden during execution of the loop.</li> <li><code>condition</code>: This statement gets evaluated ahead of each <strong>loop body</strong> execution, and aborts the loop if it evaluates to <code>false</code>.</li> <li><code>iteration execution</code>: This statement gets executed after the loop <strong>body</strong>, ahead of the next <strong>condition</strong> evaluation, unless the <code>for</code> loop is aborted in the <strong>body</strong> (by <code>break</code>, <code>goto</code>, <code>return</code> or an exception being thrown). You can enter multiple statements in the <code>iteration execution</code> part, such as <code>a++, b+=10, c=b+a</code>.</li></ul> <p>The rough equivalent of a <code>for</code> loop, rewritten as a <code>while</code> loop is:</p> <div class="language-cpp extra-class"><pre class="language-cpp"><code><span class="token comment">/*initialization*/</span>
<span class="token keyword">while</span> <span class="token punctuation">(</span><span class="token comment">/*condition*/</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token comment">// body of the loop; using 'continue' will skip to increment part below</span>
<span class="token comment">/*iteration execution*/</span>
<span class="token punctuation">}</span>
</code></pre></div><p>The most common case for using a <code>for</code> loop is to execute statements a specific number of times. For example, consider the following:</p> <div class="language-cpp extra-class"><pre class="language-cpp"><code><span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> i <span class="token operator"><</span> <span class="token number">10</span><span class="token punctuation">;</span> i<span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
std<span class="token double-colon punctuation">::</span>cout <span class="token operator"><<</span> i <span class="token operator"><<</span> std<span class="token double-colon punctuation">::</span>endl<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
</code></pre></div><p>A valid loop is also:</p> <div class="language-cpp extra-class"><pre class="language-cpp"><code><span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> a <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">,</span> b <span class="token operator">=</span> <span class="token number">10</span><span class="token punctuation">,</span> c <span class="token operator">=</span> <span class="token number">20</span><span class="token punctuation">;</span> <span class="token punctuation">(</span>a<span class="token operator">+</span>b<span class="token operator">+</span>c <span class="token operator"><</span> <span class="token number">100</span><span class="token punctuation">)</span><span class="token punctuation">;</span> c<span class="token operator">--</span><span class="token punctuation">,</span> b<span class="token operator">++</span><span class="token punctuation">,</span> a<span class="token operator">+=</span>c<span class="token punctuation">)</span> <span class="token punctuation">{</span>
std<span class="token double-colon punctuation">::</span>cout <span class="token operator"><<</span> a <span class="token operator"><<</span> <span class="token string">" "</span> <span class="token operator"><<</span> b <span class="token operator"><<</span> <span class="token string">" "</span> <span class="token operator"><<</span> c <span class="token operator"><<</span> std<span class="token double-colon punctuation">::</span>endl<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
</code></pre></div><p>An example of hiding declared variables before a loop is:</p> <div class="language-cpp extra-class"><pre class="language-cpp"><code><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">99</span><span class="token punctuation">;</span> <span class="token comment">//i = 99</span>
<span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> i <span class="token operator"><</span> <span class="token number">10</span><span class="token punctuation">;</span> i<span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment">//we declare a new variable i</span>
<span class="token comment">//some operations, the value of i ranges from 0 to 9 during loop execution</span>
<span class="token punctuation">}</span>
<span class="token comment">//after the loop is executed, we can access i with value of 99</span>
</code></pre></div><p>But if you want to use the already declared variable and not hide it, then omit the declaration part:</p> <div class="language-cpp extra-class"><pre class="language-cpp"><code><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">99</span><span class="token punctuation">;</span> <span class="token comment">//i = 99</span>
<span class="token keyword">for</span><span class="token punctuation">(</span>i <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> i <span class="token operator"><</span> <span class="token number">10</span><span class="token punctuation">;</span> i<span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment">//we are using already declared variable i</span>
<span class="token comment">//some operations, the value of i ranges from 0 to 9 during loop execution</span>
<span class="token punctuation">}</span>
<span class="token comment">//after the loop is executed, we can access i with value of 10</span>
</code></pre></div><p>Notes:</p> <ul><li>The initialization and increment statements can perform operations unrelated to the condition statement, or nothing at all - if you wish to do so. But for readability reasons, it is best practice to only perform operations directly relevant to the loop.</li> <li>A variable declared in the initialization statement is visible only inside the scope of the <code>for</code> loop and is released upon termination of the loop.</li> <li>Don't forget that the variable which was declared in the <code>initialization statement</code> can be modified during the loop, as well as the variable checked in the <code>condition</code>.</li></ul> <p>Example of a loop which counts from 0 to 10:</p> <div class="language-cpp extra-class"><pre class="language-cpp"><code><span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">int</span> counter <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> counter <span class="token operator"><=</span> <span class="token number">10</span><span class="token punctuation">;</span> <span class="token operator">++</span>counter<span class="token punctuation">)</span>
<span class="token punctuation">{</span>
std<span class="token double-colon punctuation">::</span>cout <span class="token operator"><<</span> counter <span class="token operator"><<</span> <span class="token string">'\n'</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token comment">// counter is not accessible here (had value 11 at the end)</span>
</code></pre></div><p>Explanation of the code fragments:</p> <ul><li><code>int counter = 0</code> initializes the variable <code>counter</code> to 0. (This variable can only be used inside of the <code>for</code> loop.)</li> <li><code>counter <= 10</code> is a Boolean condition that checks whether <code>counter</code> is less than or equal to 10. If it is <code>true</code>, the loop executes. If it is <code>false</code>, the loop ends.</li> <li><code>++counter</code> is an increment operation that increments the value of <code>counter</code> by 1 ahead of the next condition check.</li></ul> <p>By leaving all statements empty, you can create an infinite loop:</p> <div class="language-cpp extra-class"><pre class="language-cpp"><code><span class="token comment">// infinite loop</span>
<span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token punctuation">;</span><span class="token punctuation">;</span><span class="token punctuation">)</span>
std<span class="token double-colon punctuation">::</span>cout <span class="token operator"><<</span> <span class="token string">"Never ending!\n"</span><span class="token punctuation">;</span>
</code></pre></div><p>The <code>while</code> loop equivalent of the above is:</p> <div class="language-cpp extra-class"><pre class="language-cpp"><code><span class="token comment">// infinite loop</span>
<span class="token keyword">while</span> <span class="token punctuation">(</span><span class="token boolean">true</span><span class="token punctuation">)</span>
std<span class="token double-colon punctuation">::</span>cout <span class="token operator"><<</span> <span class="token string">"Never ending!\n"</span><span class="token punctuation">;</span>
</code></pre></div><p>However, an infinite loop can still be left by using the statements <code>break</code>, <code>goto</code>, or <code>return</code> or by throwing an exception.</p> <p>The next common example of iterating over all elements from an STL collection (e.g., a <code>vector</code>) without using the <code><algorithm></code> header is:</p> <div class="language-cpp extra-class"><pre class="language-cpp"><code>std<span class="token double-colon punctuation">::</span>vector<span class="token operator"><</span>std<span class="token double-colon punctuation">::</span>string<span class="token operator">></span> names <span class="token operator">=</span> <span class="token punctuation">{</span><span class="token string">"Albert Einstein"</span><span class="token punctuation">,</span> <span class="token string">"Stephen Hawking"</span><span class="token punctuation">,</span> <span class="token string">"Michael Ellis"</span><span class="token punctuation">}</span><span class="token punctuation">;</span>
<span class="token keyword">for</span><span class="token punctuation">(</span>std<span class="token double-colon punctuation">::</span>vector<span class="token operator"><</span>std<span class="token double-colon punctuation">::</span>string<span class="token operator">></span><span class="token double-colon punctuation">::</span>iterator it <span class="token operator">=</span> names<span class="token punctuation">.</span><span class="token function">begin</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> it <span class="token operator">!=</span> names<span class="token punctuation">.</span><span class="token function">end</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token operator">++</span>it<span class="token punctuation">)</span> <span class="token punctuation">{</span>
std<span class="token double-colon punctuation">::</span>cout <span class="token operator"><<</span> <span class="token operator">*</span>it <span class="token operator"><<</span> std<span class="token double-colon punctuation">::</span>endl<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
</code></pre></div><h2 id="while-loop"><a href="#while-loop" class="header-anchor">#</a> While loop</h2> <p>A <code>while</code> loop executes statements repeatedly until the given condition evaluates to <code>false</code>. This control statement is used when it is not known, in advance, how many times a block of code is to be executed.</p> <p>For example, to print all the numbers from 0 up to 9, the following code can be used:</p> <div class="language-cpp extra-class"><pre class="language-cpp"><code><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span>
<span class="token keyword">while</span> <span class="token punctuation">(</span>i <span class="token operator"><</span> <span class="token number">10</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
std<span class="token double-colon punctuation">::</span>cout <span class="token operator"><<</span> i <span class="token operator"><<</span> <span class="token string">" "</span><span class="token punctuation">;</span>
<span class="token operator">++</span>i<span class="token punctuation">;</span> <span class="token comment">// Increment counter</span>
<span class="token punctuation">}</span>
std<span class="token double-colon punctuation">::</span>cout <span class="token operator"><<</span> std<span class="token double-colon punctuation">::</span>endl<span class="token punctuation">;</span> <span class="token comment">// End of line; "0 1 2 3 4 5 6 7 8 9" is printed to the console</span>
</code></pre></div><p>Note that since C++17, the first 2 statements can be combined</p> <div class="language-cpp extra-class"><pre class="language-cpp"><code><span class="token keyword">while</span> <span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> i <span class="token operator"><</span> <span class="token number">10</span><span class="token punctuation">)</span>
<span class="token comment">//... The rest is the same</span>
</code></pre></div><p>To create an infinite loop, the following construct can be used:</p> <div class="language-cpp extra-class"><pre class="language-cpp"><code><span class="token keyword">while</span> <span class="token punctuation">(</span><span class="token boolean">true</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token comment">// Do something forever (however, you can exit the loop by calling 'break'</span>
<span class="token punctuation">}</span>
</code></pre></div><p>There is another variant of <code>while</code> loops, namely the <code>do...while</code> construct. See the <a href="http://stackoverflow.com/documentation/c%2b%2b/589/loops/7821/do-while-loop#t=201607221948036580158" target="_blank" rel="noopener noreferrer">do-while loop example<span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a> for more information.</p> <h2 id="do-while-loop"><a href="#do-while-loop" class="header-anchor">#</a> Do-while loop</h2> <p>A <strong>do-while</strong> loop is very similar to a <strong>while</strong> loop, except that the condition is checked at the end of each cycle, not at the start. The loop is therefore guaranteed to execute at least once.</p> <p>The following code will print <code>0</code>, as the condition will evaluate to <code>false</code> at the end of the first iteration:</p> <div class="language-cpp extra-class"><pre class="language-cpp"><code><span class="token keyword">int</span> i <span class="token operator">=</span><span class="token number">0</span><span class="token punctuation">;</span>
<span class="token keyword">do</span>
<span class="token punctuation">{</span>
std<span class="token double-colon punctuation">::</span>cout <span class="token operator"><<</span> i<span class="token punctuation">;</span>
<span class="token operator">++</span>i<span class="token punctuation">;</span> <span class="token comment">// Increment counter</span>
<span class="token punctuation">}</span>
<span class="token keyword">while</span> <span class="token punctuation">(</span>i <span class="token operator"><</span> <span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
std<span class="token double-colon punctuation">::</span>cout <span class="token operator"><<</span> std<span class="token double-colon punctuation">::</span>endl<span class="token punctuation">;</span> <span class="token comment">// End of line; 0 is printed to the console</span>
</code></pre></div><p>Note: Do not forget the semicolon at the end of <code>while(condition);</code>, which is needed in the <strong>do-while</strong> construct.</p> <p>In contrast to the <strong>do-while</strong> loop, the following will not print anything, because the condition evaluates to <code>false</code> at the beginning of the first iteration:</p> <div class="language-cpp extra-class"><pre class="language-cpp"><code><span class="token keyword">int</span> i <span class="token operator">=</span><span class="token number">0</span><span class="token punctuation">;</span>
<span class="token keyword">while</span> <span class="token punctuation">(</span>i <span class="token operator"><</span> <span class="token number">0</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
std<span class="token double-colon punctuation">::</span>cout <span class="token operator"><<</span> i<span class="token punctuation">;</span>
<span class="token operator">++</span>i<span class="token punctuation">;</span> <span class="token comment">// Increment counter</span>
<span class="token punctuation">}</span>
std<span class="token double-colon punctuation">::</span>cout <span class="token operator"><<</span> std<span class="token double-colon punctuation">::</span>endl<span class="token punctuation">;</span> <span class="token comment">// End of line; nothing is printed to the console</span>
</code></pre></div><p>Note: A <strong>while</strong> loop can be exited without the condition becoming false by using a <code>break</code>, <code>goto</code>, or <code>return</code> statement.</p> <div class="language-cpp extra-class"><pre class="language-cpp"><code><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span>
<span class="token keyword">do</span>
<span class="token punctuation">{</span>
std<span class="token double-colon punctuation">::</span>cout <span class="token operator"><<</span> i<span class="token punctuation">;</span>
<span class="token operator">++</span>i<span class="token punctuation">;</span> <span class="token comment">// Increment counter</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span>i <span class="token operator">></span> <span class="token number">5</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">break</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token keyword">while</span> <span class="token punctuation">(</span><span class="token boolean">true</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
std<span class="token double-colon punctuation">::</span>cout <span class="token operator"><<</span> std<span class="token double-colon punctuation">::</span>endl<span class="token punctuation">;</span> <span class="token comment">// End of line; 0 1 2 3 4 5 is printed to the console</span>
</code></pre></div><p>A trivial <strong>do-while</strong> loop is also occasionally used to write macros that require their own scope (in which case the trailing semicolon is omitted from the macro definition and required to be provided by the user):</p> <div class="language-cpp extra-class"><pre class="language-cpp"><code><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">define</span> <span class="token macro-name function">BAD_MACRO</span><span class="token expression"><span class="token punctuation">(</span>x<span class="token punctuation">)</span> <span class="token function">f1</span><span class="token punctuation">(</span>x<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">f2</span><span class="token punctuation">(</span>x<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">f3</span><span class="token punctuation">(</span>x<span class="token punctuation">)</span><span class="token punctuation">;</span></span></span>
<span class="token comment">// Only the call to f1 is protected by the condition here</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span>cond<span class="token punctuation">)</span> <span class="token function">BAD_MACRO</span><span class="token punctuation">(</span>var<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">define</span> <span class="token macro-name function">GOOD_MACRO</span><span class="token expression"><span class="token punctuation">(</span>x<span class="token punctuation">)</span> <span class="token keyword">do</span> <span class="token punctuation">{</span> <span class="token function">f1</span><span class="token punctuation">(</span>x<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">f2</span><span class="token punctuation">(</span>x<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">f3</span><span class="token punctuation">(</span>x<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">while</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">)</span></span></span>
<span class="token comment">// All calls are protected here</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span>cond<span class="token punctuation">)</span> <span class="token function">GOOD_MACRO</span><span class="token punctuation">(</span>var<span class="token punctuation">)</span><span class="token punctuation">;</span>
</code></pre></div><h2 id="loop-control-statements-break-and-continue"><a href="#loop-control-statements-break-and-continue" class="header-anchor">#</a> Loop Control statements : Break and Continue</h2> <p>Loop control statements are used to change the flow of execution from its normal sequence. When execution leaves a scope, all automatic objects that were created in that scope are destroyed. The <code>break</code> and <code>continue</code> are loop control statements.</p> <p>The <code>break</code> statement terminates a loop without any further consideration.</p> <div class="language-cpp extra-class"><pre class="language-cpp"><code><span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> i <span class="token operator"><</span> <span class="token number">10</span><span class="token punctuation">;</span> i<span class="token operator">++</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span>i <span class="token operator">==</span> <span class="token number">4</span><span class="token punctuation">)</span>
<span class="token keyword">break</span><span class="token punctuation">;</span> <span class="token comment">// this will immediately exit our loop</span>
std<span class="token double-colon punctuation">::</span>cout <span class="token operator"><<</span> i <span class="token operator"><<</span> <span class="token string">'\n'</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
</code></pre></div><p>The above code will print out:</p> <div class="language-cpp extra-class"><pre class="language-cpp"><code><span class="token number">1</span>
<span class="token number">2</span>
<span class="token number">3</span>
</code></pre></div><p>The <code>continue</code> statement does not immediately exit the loop, but rather skips the rest of the loop body and goes to the top of the loop (including checking the condition).</p> <div class="language-cpp extra-class"><pre class="language-cpp"><code><span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> i <span class="token operator"><</span> <span class="token number">6</span><span class="token punctuation">;</span> i<span class="token operator">++</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span>i <span class="token operator">%</span> <span class="token number">2</span> <span class="token operator">==</span> <span class="token number">0</span><span class="token punctuation">)</span> <span class="token comment">// evaluates to true if i is even</span>
<span class="token keyword">continue</span><span class="token punctuation">;</span> <span class="token comment">// this will immediately go back to the start of the loop</span>
<span class="token comment">/* the next line will only be reached if the above "continue" statement
does not execute */</span>
std<span class="token double-colon punctuation">::</span>cout <span class="token operator"><<</span> i <span class="token operator"><<</span> <span class="token string">" is an odd number\n"</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
</code></pre></div><p>The above code will print out:</p> <div class="language-cpp extra-class"><pre class="language-cpp"><code><span class="token number">1</span> is an odd number
<span class="token number">3</span> is an odd number
<span class="token number">5</span> is an odd number
</code></pre></div><p>Because such control flow changes are sometimes difficult for humans to easily understand, <code>break</code> and <code>continue</code> are used sparingly. More straightforward implementation are usually easier to read and understand. For example, the first <code>for</code> loop with the <code>break</code> above might be rewritten as:</p> <div class="language-cpp extra-class"><pre class="language-cpp"><code><span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> i <span class="token operator"><</span> <span class="token number">4</span><span class="token punctuation">;</span> i<span class="token operator">++</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
std<span class="token double-colon punctuation">::</span>cout <span class="token operator"><<</span> i <span class="token operator"><<</span> <span class="token string">'\n'</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
</code></pre></div><p>The second example with <code>continue</code> might be rewritten as:</p> <div class="language-cpp extra-class"><pre class="language-cpp"><code><span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> i <span class="token operator"><</span> <span class="token number">6</span><span class="token punctuation">;</span> i<span class="token operator">++</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span>i <span class="token operator">%</span> <span class="token number">2</span> <span class="token operator">!=</span> <span class="token number">0</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
std<span class="token double-colon punctuation">::</span>cout <span class="token operator"><<</span> i <span class="token operator"><<</span> <span class="token string">" is an odd number\n"</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
</code></pre></div><h2 id="declaration-of-variables-in-conditions"><a href="#declaration-of-variables-in-conditions" class="header-anchor">#</a> Declaration of variables in conditions</h2> <p>In the condition of the <code>for</code> and <code>while</code> loops, it's also permitted to declare an object. This object will be considered to be in scope until the end of the loop, and will persist through each iteration of the loop:</p> <div class="language-cpp extra-class"><pre class="language-cpp"><code><span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> i <span class="token operator"><</span> <span class="token number">5</span><span class="token punctuation">;</span> <span class="token operator">++</span>i<span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token function">do_something</span><span class="token punctuation">(</span>i<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token comment">// i is no longer in scope.</span>
<span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">auto</span><span class="token operator">&</span> a <span class="token operator">:</span> some_container<span class="token punctuation">)</span> <span class="token punctuation">{</span>
a<span class="token punctuation">.</span><span class="token function">do_something</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token comment">// a is no longer in scope.</span>
<span class="token keyword">while</span><span class="token punctuation">(</span>std<span class="token double-colon punctuation">::</span>shared_ptr<span class="token operator"><</span>Object<span class="token operator">></span> p <span class="token operator">=</span> <span class="token function">get_object</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
p<span class="token operator">-></span><span class="token function">do_something</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token comment">// p is no longer in scope.</span>
</code></pre></div><p>However, it is not permitted to do the same with a <code>do...while</code> loop; instead, declare the variable before the loop, and (optionally) enclose both the variable and the loop within a local scope if you want the variable to go out of scope after the loop ends:</p> <div class="language-cpp extra-class"><pre class="language-cpp"><code><span class="token comment">//This doesn't compile</span>
<span class="token keyword">do</span> <span class="token punctuation">{</span>
s <span class="token operator">=</span> <span class="token function">do_something</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span> <span class="token keyword">while</span> <span class="token punctuation">(</span><span class="token keyword">short</span> s <span class="token operator">></span> <span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// Good</span>
<span class="token keyword">short</span> s<span class="token punctuation">;</span>
<span class="token keyword">do</span> <span class="token punctuation">{</span>
s <span class="token operator">=</span> <span class="token function">do_something</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span> <span class="token keyword">while</span> <span class="token punctuation">(</span>s <span class="token operator">></span> <span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</code></pre></div><p>This is because the <strong>statement</strong> portion of a <code>do...while</code> loop (the loop's body) is evaluated before the <strong>expression</strong> portion (the <code>while</code>) is reached, and thus, any declaration in the <strong>expression</strong> will not be visible during the first iteration of the loop.</p> <h2 id="range-for-over-a-sub-range"><a href="#range-for-over-a-sub-range" class="header-anchor">#</a> Range-for over a sub-range</h2> <p>Using range-base loops, you can loop over a sub-part of a given container or other range by generating a proxy object that qualifies for range-based for loops.</p> <div class="language-cpp extra-class"><pre class="language-cpp"><code><span class="token keyword">template</span><span class="token operator"><</span><span class="token keyword">class</span> <span class="token class-name">Iterator</span><span class="token punctuation">,</span> <span class="token keyword">class</span> <span class="token class-name">Sentinel</span><span class="token operator">=</span>Iterator<span class="token operator">></span>
<span class="token keyword">struct</span> <span class="token class-name">range_t</span> <span class="token punctuation">{</span>
Iterator b<span class="token punctuation">;</span>
Sentinel e<span class="token punctuation">;</span>
Iterator <span class="token function">begin</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">const</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> b<span class="token punctuation">;</span> <span class="token punctuation">}</span>
Sentinel <span class="token function">end</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">const</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> e<span class="token punctuation">;</span> <span class="token punctuation">}</span>
<span class="token keyword">bool</span> <span class="token function">empty</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">const</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token function">begin</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">==</span><span class="token function">end</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span>
range_t <span class="token function">without_front</span><span class="token punctuation">(</span> std<span class="token double-colon punctuation">::</span>size_t count<span class="token operator">=</span><span class="token number">1</span> <span class="token punctuation">)</span> <span class="token keyword">const</span> <span class="token punctuation">{</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span>std<span class="token double-colon punctuation">::</span>is_same<span class="token operator"><</span> std<span class="token double-colon punctuation">::</span>random_access_iterator_tag<span class="token punctuation">,</span> <span class="token keyword">typename</span> <span class="token class-name">std</span><span class="token double-colon punctuation">::</span>iterator_traits<span class="token operator"><</span>Iterator<span class="token operator">></span><span class="token double-colon punctuation">::</span>iterator_category <span class="token operator">></span><span class="token punctuation">{</span><span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span>
count <span class="token operator">=</span> <span class="token punctuation">(</span>std<span class="token double-colon punctuation">::</span>min<span class="token punctuation">)</span><span class="token punctuation">(</span>std<span class="token double-colon punctuation">::</span><span class="token function">size_t</span><span class="token punctuation">(</span>std<span class="token double-colon punctuation">::</span><span class="token function">distance</span><span class="token punctuation">(</span>b<span class="token punctuation">,</span>e<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">,</span> count<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">return</span> <span class="token punctuation">{</span>std<span class="token double-colon punctuation">::</span><span class="token function">next</span><span class="token punctuation">(</span>b<span class="token punctuation">,</span> count<span class="token punctuation">)</span><span class="token punctuation">,</span> e<span class="token punctuation">}</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
range_t <span class="token function">without_back</span><span class="token punctuation">(</span> std<span class="token double-colon punctuation">::</span>size_t count<span class="token operator">=</span><span class="token number">1</span> <span class="token punctuation">)</span> <span class="token keyword">const</span> <span class="token punctuation">{</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span>std<span class="token double-colon punctuation">::</span>is_same<span class="token operator"><</span> std<span class="token double-colon punctuation">::</span>random_access_iterator_tag<span class="token punctuation">,</span> <span class="token keyword">typename</span> <span class="token class-name">std</span><span class="token double-colon punctuation">::</span>iterator_traits<span class="token operator"><</span>Iterator<span class="token operator">></span><span class="token double-colon punctuation">::</span>iterator_category <span class="token operator">></span><span class="token punctuation">{</span><span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span>
count <span class="token operator">=</span> <span class="token punctuation">(</span>std<span class="token double-colon punctuation">::</span>min<span class="token punctuation">)</span><span class="token punctuation">(</span>std<span class="token double-colon punctuation">::</span><span class="token function">size_t</span><span class="token punctuation">(</span>std<span class="token double-colon punctuation">::</span><span class="token function">distance</span><span class="token punctuation">(</span>b<span class="token punctuation">,</span>e<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">,</span> count<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">return</span> <span class="token punctuation">{</span>b<span class="token punctuation">,</span> std<span class="token double-colon punctuation">::</span><span class="token function">prev</span><span class="token punctuation">(</span>e<span class="token punctuation">,</span> count<span class="token punctuation">)</span><span class="token punctuation">}</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span><span class="token punctuation">;</span>
<span class="token keyword">template</span><span class="token operator"><</span><span class="token keyword">class</span> <span class="token class-name">Iterator</span><span class="token punctuation">,</span> <span class="token keyword">class</span> <span class="token class-name">Sentinel</span><span class="token operator">></span>
range_t<span class="token operator"><</span>Iterator<span class="token punctuation">,</span> Sentinel<span class="token operator">></span> <span class="token function">range</span><span class="token punctuation">(</span> Iterator b<span class="token punctuation">,</span> Sentinal e <span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">return</span> <span class="token punctuation">{</span>b<span class="token punctuation">,</span>e<span class="token punctuation">}</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">template</span><span class="token operator"><</span><span class="token keyword">class</span> <span class="token class-name">Iterable</span><span class="token operator">></span>
<span class="token keyword">auto</span> <span class="token function">range</span><span class="token punctuation">(</span> Iterable<span class="token operator">&</span> r <span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">using</span> std<span class="token double-colon punctuation">::</span>begin<span class="token punctuation">;</span> <span class="token keyword">using</span> std<span class="token double-colon punctuation">::</span>end<span class="token punctuation">;</span>
<span class="token keyword">return</span> <span class="token function">range</span><span class="token punctuation">(</span><span class="token function">begin</span><span class="token punctuation">(</span>r<span class="token punctuation">)</span><span class="token punctuation">,</span><span class="token function">end</span><span class="token punctuation">(</span>r<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">template</span><span class="token operator"><</span><span class="token keyword">class</span> <span class="token class-name">C</span><span class="token operator">></span>
<span class="token keyword">auto</span> <span class="token function">except_first</span><span class="token punctuation">(</span> C<span class="token operator">&</span> c <span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">auto</span> r <span class="token operator">=</span> <span class="token function">range</span><span class="token punctuation">(</span>c<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span>r<span class="token punctuation">.</span><span class="token function">empty</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token keyword">return</span> r<span class="token punctuation">;</span>
<span class="token keyword">return</span> r<span class="token punctuation">.</span><span class="token function">without_front</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
</code></pre></div><p>now we can do:</p> <div class="language-cpp extra-class"><pre class="language-cpp"><code>std<span class="token double-colon punctuation">::</span>vector<span class="token operator"><</span><span class="token keyword">int</span><span class="token operator">></span> v <span class="token operator">=</span> <span class="token punctuation">{</span><span class="token number">1</span><span class="token punctuation">,</span><span class="token number">2</span><span class="token punctuation">,</span><span class="token number">3</span><span class="token punctuation">,</span><span class="token number">4</span><span class="token punctuation">}</span><span class="token punctuation">;</span>
<span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">auto</span> i <span class="token operator">:</span> <span class="token function">except_first</span><span class="token punctuation">(</span>v<span class="token punctuation">)</span><span class="token punctuation">)</span>
std<span class="token double-colon punctuation">::</span>cout <span class="token operator"><<</span> i <span class="token operator"><<</span> <span class="token string">'\n'</span><span class="token punctuation">;</span>
</code></pre></div><p>and print out</p> <div class="language-cpp extra-class"><pre class="language-cpp"><code><span class="token number">2</span>
<span class="token number">3</span>
<span class="token number">4</span>
</code></pre></div><p>Be aware that intermediate objects generated in the <code>for(:range_expression)</code> part of the <code>for</code> loop will have expired by the time the <code>for</code> loop starts.</p> <h4 id="syntax"><a href="#syntax" class="header-anchor">#</a> Syntax</h4> <ul><li>while (<strong>condition</strong>) <strong>statement</strong> ;</li> <li>do <strong>statement</strong> while (<strong>expression</strong>) ;</li> <li>for (<strong>for-init-statement</strong> ; <strong>condition</strong> ; <strong>expression</strong>) <strong>statement</strong> ;</li> <li>for (<strong>for-range-declaration</strong> : <strong>for-range-initializer</strong>) <strong>statement</strong> ;</li> <li>break ;</li> <li>continue ;</li></ul> <h4 id="remarks"><a href="#remarks" class="header-anchor">#</a> Remarks</h4> <p><a href="http://en.cppreference.com/w/cpp/algorithm" target="_blank" rel="noopener noreferrer"><code>algorithm</code><span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a> calls are generally preferable to hand-written loops.</p> <p>If you want something an algorithm already does (or something very similar), the algorithm call is clearer, often more efficient and less error prone.</p> <p>If you need a loop that does something fairly simple (but would require a confusing tangle of binders and adapters if you were using an algorithm), then just write the loop.</p></div> <footer class="page-edit"><div class="edit-link"><a href="https://github.com/devtut/generate/edit/master/docs/cpp/loops.md" target="_blank" rel="noopener noreferrer">Edit this page on GitHub</a> <span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></div> <!----></footer> <div class="page-nav"><p class="inner"><span class="prev">
←
<a href="/cpp/basic-input-output-in-c.html" class="prev">
Basic input/output in c++
</a></span> <span class="next"><a href="/cpp/file-i-o.html">
File I/O
</a>
→
</span></p></div> </main></div><div class="global-ui"><!----></div></div>
<script src="/assets/js/app.1779e102.js" defer></script><script src="/assets/js/3.2cfa8016.js" defer></script><script src="/assets/js/673.f17e9288.js" defer></script>
</body>
</html>