我可以在非标准容器上使用迭代器库的访问函数吗?
Can I use the iterator Libraries' Access Functions on Nonstandard Containers?
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()
有一个合理的实现".
相关文章:
- 如何在函数外部访问函数中局部变量的值?
- UChildActorComponent的ChildActorClass中的访问函数
- 访问函数变体时"Invalid conversion"错误
- 在将向量作为参数传递给函数后,我无法访问函数中向量的元素
- 在64位DLL中访问函数的错误
- 访问函数中 const char *arr[] 的元素
- 访问函数的调用方类型
- 访问函数中的使用声明:与范围相关的问题
- 通过 -> 语法 c++ 从指针访问函数
- 在函数中使用 const 引用参数访问函数中成员的最佳实践 C++.
- 从另一个文件(C++,QT)访问函数未解析的外部
- 如何从主(C )访问函数中的值
- 访问函数 c++ 中的全局变量
- C++ GoogleTest 使用夹具 - 无法访问函数指针定义
- 在不知道名称的情况下访问函数参数
- C++:直接访问器或类内的访问函数
- 无法从对象访问函数
- 类的2D矢量在访问函数时出错
- 为什么在C++中访问函数时没有对象
- 我无法使用指针数组从main访问函数(在类中)