C ++:使用常数与STL迭代器

从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项第一,我希望它是倒过来的情形1和第2种情况。

我应该把这种情况作为例外? 或者是有一些更深层次的理解,我很想念?

--------------解决方案-------------

该规则像宣传的那样。

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_iteratorconst T*等。

我认为常量性被混淆你。 这里是用更简单的typedef一个例子。

typedef int* Type;
typedef const int* ConstType;

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

const的情况下1适用于迭代器,所以它使迭代器本身是常量。 它不会对迭代器“指向”的项目的任何影响。 (这就好比在T* const ,在指针是const ,而不是指向的T

在案例2中, const是名称的只是其中的一部分const_iterator ,所以它不能真正推断出什么是const那里。 类可能只是有一个坏的名称,有可能是它没有常量的。 然而,在这种情况下, const_iterator不允许它的目标元素的修改,因为它是这样定义,在标准库。

分类:C# 时间:2015-03-14 人气:0
分享到:

相关文章

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 1.496 (s). 10 q(s)