2

我在 C++ 中玩vectors,发现了这个问题,我很困惑......

#include <vector>
#include <cstdio>
using namespace std;

int main()
{
  vector<int> v;
  v.push_back(1);
  v.push_back(2);
  v.push_back(3);

  for (vector<int>::iterator it = v.begin(); it != v.end(); ++it)
  {
    printf("At: %p, %i\n", &it, *it);
  }
}

我确实运行了这个程序

g++ -Wall soquestion.cpp -o soquestion
./soquestion

输出

At: 0x7fff59c80a98, 1
At: 0x7fff59c80a98, 2
At: 0x7fff59c80a98, 3

但我认为it每次的地址都会增加?

4

5 回答 5

4
printf("At: %p, %i\n", &*it, *it);

这将向您展示我认为您想要的东西。向量中选定对象的地址,后跟向量中选定对象的值。就像 duffymo 说的那样,以前您引用的是实际it对象本身,而不是它所指向的对象。

于 2013-09-06T19:17:41.817 回答
2

指针迭代器对象,即,it保持原样,由 的输出很好地证明了&it。但是,指针或迭代器的值会递增,导致引用序列中的下一个值。这由 显示*it

如果您想查看指针/迭代器实际指向的位置,您可以使用&*it. 如果it已知是指针,则可以it直接打印:

std::cout << "&it=" << &it << " "
    "obj=" << &*it << " "
    "value=" << *it << "\n";
于 2013-09-06T19:20:28.280 回答
2

我会将第一个值解释为对内存中迭代器对象的引用,它不会改变。一旦实例化,对象引用就是常量。

第二个值是向量的索引,它是递增的。它是迭代器本身内部的一个私有数据成员,它正在被递增,而不是迭代器对象。

我不相信您正在正确考虑迭代器对象。

于 2013-09-06T19:07:24.603 回答
1

迭代器地址在当前范围内保持固定

我想你可能想要这个:

printf("At: %p, %i\n", &*it, *it);
于 2013-09-06T19:13:13.790 回答
1

增加任何对象(甚至是指针)都不会改变该对象的地址。如果它是一个指针,递增它会改变它指向的地址,但指针本身的地址仍然是相同的。例如,在这段代码中,相同的地址(的地址b)被打印了两次。

int a;
int* b = &a;
std::cout << &b << std::endl;
++b;
std::cout << &b << std::endl;

迭代器不一定是指针,它只是一些对象,它重载了必要的运算符以有点像指针(至少*,++==,尽管有时还有其他)。尽管如此,同样的事情仍然适用,增加对象(或除销毁之外的任何其他操作)不会更改对象的地址。

于 2013-09-06T19:18:49.187 回答