我可以在非标准容器上使用迭代器库的访问函数吗?
Can I use the iterator Libraries' Access Functions on Nonstandard Containers?
iterator
库在 C++11、C++14 和 C++17 的过程中引入了很多 access functions:
begin
/end
cbegin
/cend
crbegin
/crend
data
empty
rbegin
/rend
size
我可以在任何容器上使用这些,甚至是非标准容器(前提是它们提供可访问的相应方法吗?)例如给定一个 QVector
foo
我可以这样做吗:
const auto bar = begin(foo);
据我了解,你的问题好像是:如果容器提供了一个成员函数begin
,我可以把它作为一个自由函数来调用吗?您的问题的答案是肯定的,因为标准提供了模板化的自由函数 begin,它只是尝试调用成员函数 begin;来自 http://en.cppreference.com/w/cpp/iterator/begin:"Returns an iterator to the beginning of the given container c or array array. These templates rely on C::begin()
having a reasonable implementation.".
std::begin
的声明如下(来自§24.7):
template <class C> auto begin(C& c) -> decltype(c.begin());
template <class C> auto begin(const C& c) -> decltype(c.begin());
因此,这些函数将为任何 class C
定义,使得 c.begin()
为 "valid"(确实存在)。该标准还保证这些将:
Returns: c.begin()
.
所以是的你可以在任何C
类型的容器上使用begin(c)
只要:
- 提供了成员函数
C::begin()
。
- 存在
begin(C const&)
或 begin(C &)
函数。
独立的 begin
函数不应位于 std::
命名空间中,而应位于与 class C
相同的命名空间中,以便名称查找可以找到它。
iterator
库在 C++11、C++14 和 C++17 的过程中引入了很多 access functions:
begin
/end
cbegin
/cend
crbegin
/crend
data
empty
rbegin
/rend
size
我可以在任何容器上使用这些,甚至是非标准容器(前提是它们提供可访问的相应方法吗?)例如给定一个 QVector
foo
我可以这样做吗:
const auto bar = begin(foo);
据我了解,你的问题好像是:如果容器提供了一个成员函数begin
,我可以把它作为一个自由函数来调用吗?您的问题的答案是肯定的,因为标准提供了模板化的自由函数 begin,它只是尝试调用成员函数 begin;来自 http://en.cppreference.com/w/cpp/iterator/begin:"Returns an iterator to the beginning of the given container c or array array. These templates rely on C::begin()
having a reasonable implementation.".
std::begin
的声明如下(来自§24.7):
template <class C> auto begin(C& c) -> decltype(c.begin());
template <class C> auto begin(const C& c) -> decltype(c.begin());
因此,这些函数将为任何 class C
定义,使得 c.begin()
为 "valid"(确实存在)。该标准还保证这些将:
Returns:
c.begin()
.
所以是的你可以在任何C
类型的容器上使用begin(c)
只要:
- 提供了成员函数
C::begin()
。 - 存在
begin(C const&)
或begin(C &)
函数。
独立的 begin
函数不应位于 std::
命名空间中,而应位于与 class C
相同的命名空间中,以便名称查找可以找到它。