因为我们知道 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]
首先,查看 C++ 中"指针算术"的定义,它适用于元素,而不是字节。然后,仅仅因为迭代器引用某个地址的对象并不意味着两个迭代器之间的差异与它们引用的两个地址之间的差异是相同的数值。
其次,如上所述,仅仅因为迭代器引用了某个地址并不意味着您可以为该迭代器分配地址。想想是什么让迭代器与指针不同,并将其与你对封装的知识结合起来。
1) 20 字节,是的,考虑到每个元素 4 个字节,这大约是对的。但是计算v.end()-v.begin()
会给你向量的大小(更一般地说,只是随机访问迭代器),而不是它们的地址差异。这不是带有char*
的指针算术,而是在迭代器上operator-
,其实现方式不同。
2)迭代器通常不能从指针中创建。但是您可以使用std::advance(std::begin(a), 3)
,它可以逐个递增,也可以直接使用+3
,具体取决于迭代器类型。