我可以在非标准容器上使用迭代器库的访问函数吗?

Can I use the iterator Libraries' Access Functions on Nonstandard Containers?

本文关键字:访问 函数 迭代器 非标准 我可以      更新时间:2023-10-16

iterator库在c++ 11、c++ 14和c++ 17的过程中引入了大量的访问函数:

  • begin/ end
  • cbegin/ cend
  • crbegin/ crend
  • data
  • empty
  • rbegin/ rend
  • size

我可以在任何容器上使用这些,甚至是非标准容器(只要它们提供一个可访问的相应方法?)例如,给定QVector foo,我可以这样做:

const auto bar = begin(foo);

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());

所以这些函数将被定义为任何类C,这样c.begin()是"有效的"(确实存在)。该标准还保证这些将:

返回: c.begin() .

所以你可以在任何C类型的容器上使用begin(c),只要:

  • 提供C::begin()成员函数
  • 存在begin(C const&)begin(C &)函数

独立的begin函数不应该在std::名称空间中,而是在与您的类C相同的名称空间中,因此名称查找可以找到它。

据我所知,您的问题似乎是:如果容器提供成员函数begin,那么我可以将其称为自由函数吗?你的问题的答案是肯定的,因为标准提供了一个模板化的自由函数begin,它只是试图调用成员函数begin;返回一个指向给定容器c或数组array开头的迭代器。这些模板依赖于C::begin()有一个合理的实现".