Are begin(container) and end(container) standardized?
Asked Answered
T

1

6

Are the non-member function templates begin(container) and end(container) part of C++0x? If so, in which header file do they live?

Transudation answered 30/7, 2011 at 10:28 Comment(0)
A
8

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>.

Aspinwall answered 30/7, 2011 at 10:48 Comment(5)
Out of sheer curiosity: Why would someone use them instead of c.begin()?Smearcase
@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.