繁体   English   中英

C ++:使用const和STL迭代器

[英]C++: using const with STL iterators

Effective C ++ ,第3项

/* case1 */ const std::vector<int>::iterator i  // i  acts like a T* const
/* case2 */ std::vector<int>::const_iterator ci // ci acts like a const T*

为了记住const是如何应用的,我曾经记得本文中的以下内容

基本上'const'适用于其左边的任何东西(除非没有任何东西,在这种情况下它适用于它的直接权利)。

当我首先阅读书中的第3项时,我预计它将在case1和case2中反过来。

我应该把这个案子当作例外吗? 或者是否有一些我缺失的更深层次的理解?

该规则与宣传的一样有效。

const std::vector<int>::iterator i

右边的项是iterator :迭代器是不可变的。 你不能指定迭代器指向向量中的不同项,你不能递增它,它总是指向它被初始化的项。 但是,您可以更改指向的项目。

这很少是期望的行为,这就是const_iterator typedef存在的原因。

std::vector<int>::const_iterator ci

迭代器可以四处移动,但指向的项目无法修改。 这几乎总是你想要的 - 你想迭代一个向量但不能修改它的内容。

这里没有const关键字,因此您无法使用该规则来解决问题。 对于这个,您只需要了解const_iterator要记录的内容。

你可以认为这是因为,如果迭代器中的typedef编着,像这样:

typedef T* iterator;
typedef const T* const_iterator;

当您将const添加到其中任何一个时,它将应用于顶层 ,即应用于指针本身,而不是指向的对象,因此以下等效项包含:

const iterator it; // is the same as:
T* const it;

const const_iterator it; // is the same as:
const T* const it;

它们也不例外; 这就是所有typedef的工作方式。

引用的规则绝对适用于const关键字。 但是,在处理迭代器时, const_iterator类仅被命名为(它同样可以是readonly_iterator ),因此关于const关键字的规则不适用。

但是,您可以像这样声明案例1:

std::vector<int>::iterator const i

就像你可以指定const int xint const x

迭代器指向的类型也在其容器的模板参数中指定,因此排序与声明普通变量不同。

我无法看到这里有任何特定的经验法则 - 你的帖子中的评论是正确的想法,你只需要学习将const_iterator视为const T*等等。

我认为const_iterator让你很困惑。 这是一个更简单的typedef的例子。

typedef int* Type;
typedef const int* ConstType;

int main() {
  const Type a; // int * const
  ConstType b; // const int *
}

情况1中的const适用于迭代器,因此它使迭代器本身成为常量。 它对迭代器“指向”的项没有任何影响。 (这就像在T* const ,其中指针是const ,而不是指向T

在第2种情况下, const只是名称const_iterator一部分,因此无法真正推断出const是什么。 这个类可能只有一个坏名字,根本就没有关于它的const。 但是在这种情况下, const_iterator不允许修改它的目标元素,因为它的定义与标准库中的类似。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM