a const_iterator
和an 之间的区别是什么iterator
?你在哪一个使用另一个?
const_iterator
s不允许你改变他们指向的值,常规iterator
s.
与C++中的所有内容一样,总是更喜欢const
,除非有充分的理由使用常规迭代器(即您希望使用它们不会const
更改指向值的事实).
它们几乎应该是不言自明的.如果迭代器指向类型为T的元素,则const_iterator指向"const T"类型的元素.
它基本上等同于指针类型:
T* // A non-const iterator to a non-const element. Corresponds to std::vector::iterator T* const // A const iterator to a non-const element. Corresponds to const std::vector ::iterator const T* // A non-const iterator to a const element. Corresponds to std::vector ::const_iterator
const迭代器总是指向同一个元素,因此迭代器本身就是const.但它指向的元素不一定是const,所以它指向的元素可以改变.const_iterator是指向const元素的迭代器,因此虽然可以更新迭代器本身(例如递增或递减),但它指向的元素不能更改.
不幸的是,STL容器的很多方法都使用迭代器而不是const_iterators作为参数.所以,如果你有一个const_iterator,你不能说"在这个迭代器指向的元素之前插入一个元素"(在我看来,这样的事情在概念上不是一个const违规).如果你想要这样做,你必须使用std :: advance()或boost :: next()将它转换为非const迭代器.例如.boost :: next(container.begin(),std :: distance(container.begin(),the_const_iterator_we_want_to_unconst)).如果container是std :: list,那么该调用的运行时间将为O(n).
因此,在STL容器方面,将const添加到任何"逻辑"的通用规则都不太通用.
但是,boost容器需要const_iterators(例如boost :: unordered_map :: erase()).因此,当您使用增强容器时,您可以"持久".顺便问一下,有人知道STL容器是否或何时会被修复?
尽可能使用const_iterator,在没有其他选择时使用迭代器.