#include <vector>
#include <iostream>
template <typename T>
void foo(T begin, T end)
{
for (; begin != end; ++begin)
{
std::cout << " " << *begin;
}
}
template <typename T>
void foo(T begin, std::reverse_iterator<T> end)
{
foo(begin, end.base());
}
template <typename T>
void foo(std::reverse_iterator<T> begin, T end)
{
foo(begin, std::reverse_iterator<T>(end));
}
int main()
{
std::vector<int> v { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
foo(v.begin(), v.end()); std::cout << std::endl;
foo(v.begin(), v.rbegin()); std::cout << std::endl;
foo(v.rbegin(), v.begin()); std::cout << std::endl;
foo(v.rbegin(), v.rend()); std::cout << std::endl;
}
I2luY2x1ZGUgPHZlY3Rvcj4KI2luY2x1ZGUgPGlvc3RyZWFtPgoKdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CnZvaWQgZm9vKFQgYmVnaW4sIFQgZW5kKQp7CiAgZm9yICg7IGJlZ2luICE9IGVuZDsgKytiZWdpbikKICB7CiAgICBzdGQ6OmNvdXQgPDwgIiAiIDw8ICpiZWdpbjsKICB9Cn0KCnRlbXBsYXRlIDx0eXBlbmFtZSBUPgp2b2lkIGZvbyhUIGJlZ2luLCBzdGQ6OnJldmVyc2VfaXRlcmF0b3I8VD4gZW5kKQp7CiAgZm9vKGJlZ2luLCBlbmQuYmFzZSgpKTsKfQoKdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CnZvaWQgZm9vKHN0ZDo6cmV2ZXJzZV9pdGVyYXRvcjxUPiBiZWdpbiwgVCBlbmQpCnsKICBmb28oYmVnaW4sIHN0ZDo6cmV2ZXJzZV9pdGVyYXRvcjxUPihlbmQpKTsKfQoKaW50IG1haW4oKQp7CiAgc3RkOjp2ZWN0b3I8aW50PiB2IHsgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSB9OwogIGZvbyh2LmJlZ2luKCksIHYuZW5kKCkpOyBzdGQ6OmNvdXQgPDwgc3RkOjplbmRsOwogIGZvbyh2LmJlZ2luKCksIHYucmJlZ2luKCkpOyBzdGQ6OmNvdXQgPDwgc3RkOjplbmRsOwogIGZvbyh2LnJiZWdpbigpLCB2LmJlZ2luKCkpOyBzdGQ6OmNvdXQgPDwgc3RkOjplbmRsOwogIGZvbyh2LnJiZWdpbigpLCB2LnJlbmQoKSk7IHN0ZDo6Y291dCA8PCBzdGQ6OmVuZGw7Cn0K