I believe this is relatively new that an iterator class is required to have the following tags at the top of the class:
using iterator_category = std::bidirectional_iterator_tag;
using value_type = T;
using difference_type = int;
using pointer = T*;
using reference = T&;
Why are these necessary and what are they doing behind the scenes? (if anything)