Iterator types are separate from the container types they are used with, though the two are often used in concert. The category of the iterator (and thus the operations defined for it) usually depends on the type of container, with for instance arrays or vectors providing random access iterators, but sets (which use a linked structure as implementation) only providing bidirectional iterators. A same container type can have more than one associated iterator type; for instance the codice_21 container type allows traversal either using (raw) pointers to its elements (of type codice_22), or values of a special type codice_23, and yet another type is provided for "reverse iterators", whose operations are defined in such a way that an algorithm performing a usual (forward) traversal will actually do traversal in reverse order when called with reverse iterators. Most containers also provide a separate codice_24 type, for which operations that would allow changing the values pointed to are intentionally not defined.