Difference between revisions of "cpp/iterator/input or output iterator"
From cppreference.com
D41D8CD98F (Talk | contribs) m (→Example: ~) |
(Links to the definition of “referenceable type”.) |
||
(One intermediate revision by one user not shown) | |||
Line 1: | Line 1: | ||
{{cpp/title|input_or_output_iterator}} | {{cpp/title|input_or_output_iterator}} | ||
{{cpp/iterator/navbar}} | {{cpp/iterator/navbar}} | ||
− | {{ | + | {{ddcl|header=iterator|since=c++20|1= |
− | + | ||
− | + | ||
template< class I > | template< class I > | ||
concept input_or_output_iterator = | concept input_or_output_iterator = | ||
Line 11: | Line 9: | ||
std::weakly_incrementable<I>; | std::weakly_incrementable<I>; | ||
}} | }} | ||
− | |||
The {{tt|input_or_output_iterator}} concept forms the basis of the iterator concept taxonomy; every iterator type satisfies the {{tt|input_or_output_iterator}} requirements. | The {{tt|input_or_output_iterator}} concept forms the basis of the iterator concept taxonomy; every iterator type satisfies the {{tt|input_or_output_iterator}} requirements. | ||
− | The exposition-only concept {{c|/*can-reference*/}} is satisfied if and only if the type is | + | The exposition-only concept {{c|/*can-reference*/}} is satisfied if and only if the type is [[cpp/meta#Definitions|referenceable]]. |
{{todo|Is *i required to be equality-preserving?}} | {{todo|Is *i required to be equality-preserving?}} | ||
Line 31: | Line 28: | ||
===Example=== | ===Example=== | ||
A minimum iterator. | A minimum iterator. | ||
− | + | {{source|1= | |
− | {{ | + | |
− | | | + | |
#include <cstddef> | #include <cstddef> | ||
#include <iterator> | #include <iterator> | ||
− | struct SimpleIterator { | + | struct SimpleIterator |
+ | { | ||
using difference_type = std::ptrdiff_t; | using difference_type = std::ptrdiff_t; | ||
− | + | ||
int operator*(); | int operator*(); | ||
− | + | ||
SimpleIterator& operator++(); | SimpleIterator& operator++(); | ||
void operator++(int) { ++*this; } | void operator++(int) { ++*this; } | ||
Line 47: | Line 43: | ||
static_assert(std::input_or_output_iterator<SimpleIterator>); | static_assert(std::input_or_output_iterator<SimpleIterator>); | ||
− | |||
− | |||
}} | }} | ||
{{langlinks|es|ja|zh}} | {{langlinks|es|ja|zh}} |
Latest revision as of 23:27, 4 September 2024
Defined in header <iterator>
|
||
template< class I > concept input_or_output_iterator = |
(since C++20) | |
The input_or_output_iterator
concept forms the basis of the iterator concept taxonomy; every iterator type satisfies the input_or_output_iterator
requirements.
The exposition-only concept /*can-reference*/ is satisfied if and only if the type is referenceable.
This section is incomplete Reason: Is *i required to be equality-preserving? |
[edit] Notes
input_or_output_iterator
itself only specifies operations for dereferencing and incrementing an iterator. Most algorithms will require additional operations, for example:
- comparing iterators with sentinels (see
sentinel_for
); - reading values from an iterator (see
indirectly_readable
andinput_iterator
); - writing values to an iterator (see
indirectly_writable
andoutput_iterator
); - a richer set of iterator movements (see
forward_iterator
,bidirectional_iterator
,random_access_iterator
).
Unlike the LegacyIterator requirements, the input_or_output_iterator
concept does not require copyability.
[edit] Example
A minimum iterator.
#include <cstddef> #include <iterator> struct SimpleIterator { using difference_type = std::ptrdiff_t; int operator*(); SimpleIterator& operator++(); void operator++(int) { ++*this; } }; static_assert(std::input_or_output_iterator<SimpleIterator>);