std::end(myVector) 和 myVector.end() 之间的区别

Difference between std::end(myVector) and myVector.end()

我注意到有两种方法可以获取向量(或其他容器class)的结束迭代器:

std::end(myVector)

myVector.end()

其他各种容器迭代器函数也是如此,begincendcbeginrendrbegincrendcrbeginfind 等。我想知道它们之间是否存在任何功能差异?如果没有,是否有一些历史原因需要同时拥有它们?

(很抱歉,如果这是重复的,我已经进行了全面搜索,并找到了这些方法中的一种或另一种的大量资源,但是 none 提到了这两种方法或比较了两种方法。)

这是有历史原因的:在C++11之前,只有成员函数版本存在。 C++11 添加了非成员,它也适用于普通 C 样式数组,因此可以认为更通用。

int a[] = {3, 1, 5, 67, 28, -12};
std::sort(std::begin(a), std::end(a));

应用于标准库容器时,std::beginstd::end的作用是调用容器的begin()end()成员函数,所以没有函数式差异。

C++14 添加了 std::cbeginstd::cendstd::rbeginstd::rendstd::crbeginstd::crend,具有类似的行为。