This commit is contained in:
2025-10-25 03:02:53 +03:00
commit 043225d523
3416 changed files with 681196 additions and 0 deletions

View File

@@ -0,0 +1,53 @@
[range.req.general]
# 25 Ranges library [[ranges]](./#ranges)
## 25.4 Range requirements [[range.req]](range.req#general)
### 25.4.1 General [range.req.general]
[1](#1)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/ranges.tex#L1287)
Ranges are an abstraction that allows a C++ program
to operate on elements of data structures uniformly[.](#1.sentence-1)
Calling ranges::begin on a range returns an object
whose type models [input_or_output_iterator](iterator.concept.iterator#concept:input_or_output_iterator "24.3.4.6Concept input_­or_­output_­iterator[iterator.concept.iterator]") ([[iterator.concept.iterator]](iterator.concept.iterator "24.3.4.6Concept input_­or_­output_­iterator"))[.](#1.sentence-2)
Calling ranges::end on a range returns an object whose type S,
together with the type I of the object returned by ranges::begin,
models [sentinel_for](iterator.concept.sentinel#concept:sentinel_for "24.3.4.7Concept sentinel_­for[iterator.concept.sentinel]")<S, I>[.](#1.sentence-3)
The library formalizes the interfaces, semantics, and complexity of ranges
to enable algorithms and range adaptors that work efficiently
on different types of sequences[.](#1.sentence-4)
[2](#2)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/ranges.tex#L1299)
The [range](range.range#concept:range "25.4.2Ranges[range.range]") concept requires thatranges::begin and ranges::end return an iterator and a sentinel, respectively[.](#2.sentence-1)
The [sized_range](range.sized#concept:sized_range "25.4.4Sized ranges[range.sized]") concept refines [range](range.range#concept:range "25.4.2Ranges[range.range]") with
the requirement that ranges::size be amortized O(1)[.](#2.sentence-2)
The [view](range.view#concept:view "25.4.5Views[range.view]") concept specifies requirements on
a [range](range.range#concept:range "25.4.2Ranges[range.range]") type to provide operations with predictable complexity[.](#2.sentence-3)
[3](#3)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/ranges.tex#L1308)
Several refinements of [range](range.range#concept:range "25.4.2Ranges[range.range]") group requirements
that arise frequently in concepts and algorithms[.](#3.sentence-1)
Common ranges are ranges for whichranges::begin and ranges::end return objects of the same type[.](#3.sentence-2)
Random access ranges are ranges for which ranges::begin returns a type that models[random_access_iterator](iterator.concept.random.access#concept:random_access_iterator "24.3.4.13Concept random_­access_­iterator[iterator.concept.random.access]") ([[iterator.concept.random.access]](iterator.concept.random.access "24.3.4.13Concept random_­access_­iterator"))[.](#3.sentence-3)
(Contiguous, bidirectional, forward, input, and output ranges
are defined similarly[.](#3.sentence-4))
Viewable ranges can be converted to views[.](#3.sentence-5)