Both STL algorithms and the range-based for
loop assume that the begin and end positions of the iteration are known in advance. In some situations, however, it is hardly possible to know the end position before reaching it by iteration.
A very simple example for this is iterating over plain C-Style strings, the length of which is not known before runtime. The code which iterates over such strings usually looks like this:
for (const char *c_ponter = some_c_string; *c_pointer != '\0'; ++c_pointer) { const char c = *c_pointer; // do something with c }
The only way to put this into a range-based for
loop seems to be wrapping it into an std::string
, which has begin()
and end()
functions:
for (char c : std::string(some_c_string)) { /* do something with c */ }
However, the constructor of std::string
will iterate over the whole string before our for
loop can iterate over it. Since C++17, we also have std::string_view
, but its constructor...