Are the non-member function templates begin(container)
and end(container)
part of C++0x? If so, in which header file do they live?
Are begin(container) and end(container) standardized?
Asked Answered
Yes, but just as swap
is defined in different places and depends on ADL, so are begin
and end
. The 'generic' versions are defined in <iterator>
:
// 24.6.5, range access:
template <class C> auto begin(C& c) -> decltype(c.begin());
template <class C> auto begin(const C& c) -> decltype(c.begin());
template <class C> auto end(C& c) -> decltype(c.end());
template <class C> auto end(const C& c) -> decltype(c.end());
template <class T, size_t N> T* begin(T (&array)[N]);
template <class T, size_t N> T* end(T (&array)[N]);
Note also that 24.6.5 says:
In addition to being available via inclusion of the
<iterator>
header, the function templates in 24.6.5 are available when any of the following headers are included:<array>
,<deque>
,<forward_list>
,<list>
,<map>
,<regex>
,<set>
,<string>
,<unordered_map>
,<unordered_set>
, and<vector>
.
@Karl because that's not possible for all types you can iterate over. That if
c
is an array. –
Stroh @Karl: although the prefix syntax becomes unreadable when chained (
f(g(h(x)), a(b(y)))
), it's extensible and looks much more like functional programming. It only remains to add open multi-methods to the language. –
Aspinwall @Karl: Atop of what Johannes and ybungalobill said: Every C++ programmer (especially those coming from Java, C# and the like) should have read this classic article by Scott Meyers. –
Overunder
@Karl: For a situation where global begin/end are indispensable, see the pretty printer, or STL #6 (from where I got the idea). –
Articulation
© 2022 - 2024 — McMap. All rights reserved.
c.begin()
? – Smearcase