c++ - begin() 和 end() 函数不应该是模板类 Vector 的成员函数吗?

标签 c++ templates c++11 auto

In page 82 of the draft of Chapter 3 : A Tour of C++: Abstraction Mechanisms作者写道:

If we also want to use the range-for loop for our Vector, we must define suitable begin() and end() functions:

template<typename T>
T∗ begin(Vector<T>& x)
{
    return &x[0]; // pointer to first element
}

template<typename T>
T∗ end(Vector<T>& x)
{
    return x.begin()+x.size(); // pointer to one-past-last element
}

鉴于这些,我们可以写:

void f2(const Vector<string>& vs) // Vector of some strings
{
    for (auto s : vs)
        cout << s << ’\n’;
}

请注意,类模板 Vector 是在草案的第 81 页中定义的。

最佳答案

要使基于范围的 for 工作,编译器需要找到合适的函数来获取迭代器。

  • 如果使用的类型是类,它将首先在该类的范围内查找成员函数 beginend

  • 如果类型不是类或没有这样的成员函数,它将通过Argument Dependent Lookup. 查找它们。

这就是基于范围的 for 在 C 数组上起作用的原因。显然,数组不能有成员函数,所以标准库提供了两个类似定义的函数:

template<typename T, size_t N>
T* begin( T(&array)[N] )
{
    return array;
}

end 也是如此。

从标题回答你的问题:它们可以,但这不是必需的。您可以在与您的类相同的命名空间中定义自由函数,它们将被找到。

关于c++ - begin() 和 end() 函数不应该是模板类 Vector 的成员函数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17994460/

相关文章:

c++ - std::vector 持有类方法

c++ - 编译器如何知道字节序是什么?

c++ - Visual Studio 无法识别模板类中的结构

templates - 如何更新 Go 模板中的字段值

c++ - 对静态 constexpr 字符串的 undefined reference (除非它是一个指针)

c++ - 按字典顺序比较两个字符串中的第 k 个单词

c++ - 定义我自己的复制构造函数

c++ - 从可变模板构造类

c++ - 一种特定类型的可变模板参数

c++ - 如何重新循环分配给 std::shared_ptr 的控制 block