c++11中自由函数begin()及end()的实现
c++11中新增了自由函数begin,end,可以用在数组上,如:
char s[] = "abcdefg"; for(auto i= std::begin(s); i != std::end(s); i++) { std::cout << *i << std::endl; }
一直好奇std::end函数的实现方式,它是如何知道数组长度的?查看g++中标准库的源码,找到数组的实际如下:
template<class _Tp, size_t _Nm> inline _Tp* begin(_Tp (&__arr)[_Nm]) { return __arr; } template<class _Tp, size_t _Nm> inline _Tp* end(_Tp (&__arr)[_Nm]) { return __arr + _Nm; }
可以看到参数为指向数组的引用,数组大小也通过模板巧妙的实现了,模板扩展后的代码类似如下:
//test.cpp #include <iostream> //#include <iterator> char* begin(char (&arr)[8]) { return arr; } char* end(char (&arr)[8]) { return arr + 8; } int main() { char s[] = "abcdefg"; for(auto i= begin(s); i != end(s); i++) { std::cout << *i << std::endl; } return 0; }
浙公网安备 33010602011771号