迭代器指针 - c++迭代器类型




C++ STL中的const_iterator和非const迭代器有什么区别? (5)

const_iteratoriterator之间有什么区别,你会在哪里使用另一个?


(正如其他人所说的)const_iterator不允许你修改它指向的元素,这在const类方法中很有用。 它也可以让你表达你的意图。


const_iterator不允许你改变它们指向的值,常规iterator就是这样做的。

和C ++中的所有东西一样,除非有充分理由使用常规迭代器(即,您想使用它们不是const来更改指向值),否则始终更喜欢const


不幸的是,很多STL容器的方法都是以迭代器而不是const_iterators作为参数。 所以如果你有一个const_iterator ,你不能说“在这个迭代器指向的元素之前插入一个元素”(在我看来,这样的事情在概念上并不是一个常量违反)。 如果你想这样做,你必须使用std :: advance()boost :: next()将其转换为非const迭代器。 例如。 boost :: next(container.begin(),std :: distance(container.begin(),the_const_iterator_we_want_to_unconst)) 。 如果容器std :: list ,那么该调用的运行时间将是O(n)

因此,在STL容器中,添加const的通用规则在“逻辑”的位置添加是不太普遍的。

但是,boost容器需要const_iterators(例如boost :: unordered_map :: erase())。 所以当你使用boost容器时,你可以是“不变的”。 顺便说一下,有谁知道是否或何时STL容器将被修复?


他们应该几乎不言自明。 如果迭代器指向T类型的元素,则const_iterator指向'const T'类型的元素。

它基本上等同于指针类型:

T* // A non-const iterator to a non-const element. Corresponds to std::vector<T>::iterator
T* const // A const iterator to a non-const element. Corresponds to const std::vector<T>::iterator
const T* // A non-const iterator to a const element. Corresponds to std::vector<T>::const_iterator

const迭代器总是指向相同的元素,所以迭代器本身是const。 但是它指向的元素不一定是const,所以它指向的元素可以改变。 const_iterator是一个指向const元素的迭代器,因此当迭代器本身可以更新时(例如递增或递减),它指向的元素不能被更改。


尽可能使用const_iterator ,当你没有其他选择时使用迭代器





const