为迭代器分配地址

时间:2019-01-05 10:18:06

标签: c++ iterator

我们知道cpp中的迭代器指向容器的某个元素,就像我们谈论向量

vector <int> v = {1,2,3,4,5}

vector<int>::iterator ptr;
ptr=v.begin();

比ptr会指向第一个内存块,例如200 让我们声明另一个迭代器

vector<int>::iterator ptrend;
ptrend=v.end() 

which point to just next follow of last element say will 
be equal to 220

我的疑问

1)而且我们知道v.end()-v.begin() = v.size()     但在我们的情况下220 -200 =20 != size

并非如此

2)可以说vector<int>::iterator ptr=v.begin();    我们可以在这里分配类似ptr = &a[3]

的内容

2 个答案:

答案 0 :(得分:1)

首先,检查C ++中“指针算术”的定义,该定义适用于元素而不是字节。然后,仅因为迭代器在某个地址处引用了一个对象并不意味着两个迭代器之间的差与其引用的两个地址之间的差具有相同的数值。

第二,就像上面一样,仅因为迭代器引用了某个地址并不意味着您可以为该迭代器分配地址。考虑一下使迭代器与指针不同的原因,并将其与有关封装的知识结合起来。

答案 1 :(得分:1)

1)20字节,是的,考虑到每个元素4字节,这是正确的。但是计算v.end()-v.begin()会为您提供向量的大小(更普遍的是,仅 随机访问迭代器),而不是它们的地址差。这不是char*的指针算术,而是迭代器上的operator-,实现方式有所不同。

2)通常不能在指针之外创建迭代器。但是您可以使用std::advance(std::begin(a), 3),它可以一一递增,也可以直接使用+3,具体取决于迭代器的类型。