像许多人一样,我一直在尝试C + 11带来的不同功能.我最喜欢的一个是"基于范围的循环".
我明白那个:
for(Type& v : a) { ... }
Run Code Online (Sandbox Code Playgroud)
相当于:
for(auto iv = begin(a); iv != end(a); ++iv)
{
Type& v = *iv;
...
}
Run Code Online (Sandbox Code Playgroud)
而这begin()只是返回a.begin()标准容器.
但是,如果我想让我的自定义类型"基于范围的循环" - 意识到什么?
如果我只是专注begin()和end()?
如果我的自定义类型属于命名空间xml,我应该定义xml::begin()还是std::begin()?
简而言之,这样做的准则是什么?
我今天正在阅读有关支持双向迭代的容器的方法,这段代码是有效的:
Collection c(10, 10);
auto last = --c.end();
*last;
Run Code Online (Sandbox Code Playgroud)
这让我想到,当提交一对双向迭代器[求,结束]到STL中的算法时,是否需要定义?end?如果是这样,结果是否可以解除引用?
即
void algo(T beg, T end){
//...
auto iter = --end;
//...
*iter;
}
Run Code Online (Sandbox Code Playgroud)