In C++ an Iterator is a concept, not a concrete (or abstract) type, but any type that obeys certain iterator like rules.
For example iterators generally can be incremented ++i
. They can be accessed (dereferenced) *i
to obtain the value they currently point to. They are essentially abstractions of a pointer.
In the Standard Library's containers & algorithms there are different kinds of iterators with different properties. Their properties are listed here:
https://en.cppreference.com/w/cpp/iterator
So when writing algorithms in C++ that accept iterators, generally just accept generic template parameters and use the appropriate iterator properties in the function. The compiler will complain if the user passes something to your function that doesn't obey the iterator rules:
template<typename Iterator>
void my_algorithm(Iterator begin, Iterator end)
{
for(; begin != end; ++begin)
std::cout << *begin << '
';
}
You can add a whole bunch of specific checks to make sure the user passed something sensible, but that's too broad for this question.
Note:
Whilst currently concepts, such as Iterator, are merely a set of agreed upon semantic properties in the Standard that programmers must follow, a more comprehensive solution that will formalize such concepts (in code) is intended for the next version of the Standard, C++20.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…