3

我有一个(未注释的...)源文件,我正在尝试理解。

static const Map *gCurMap;
static std::vector<Map> mapVec;

然后

auto e = mapVec.end();
auto i = mapVec.begin();
while(i!=e) {
    // ...
    const Map *map = gCurMap = &(*(i++));
    // ...
}

我不明白是做什么&(*(i++))的。仅使用时它不会编译i++,但对我来说它看起来一样,因为我正在“递增” i,然后我请求给定地址的值,然后我请求这个值的地址?!

4

4 回答 4

4

一点也不。&*x与 相同operator&(operator*(x)),可以是任何你想要的。

仅对于与 .相同的指针类型T * p适用。但是 C++ 有用户定义的类型和可重载的运算符。&*pp

解引用运算符 ( *) 通常为迭代器重载以返回对容器元素的引用。与号运算符 ( &) 对容器元素的影响取决于类作者;如果你想无条件地获取地址,你应该使用std::addressof(*i++)(来自你最喜欢的 header <memory>)。

于 2012-12-18T22:50:15.420 回答
3

mapVec.begin()返回一个重载的迭代器operator++。迭代器的“取消引用”(重载operator*)是为了获取map对象。引用&是,因为map它是一个指针,所以它被分配给对象的地址,从i. 我们不能仅仅i++因为它仍然是一个迭代器,而不是实际的map对象。

于 2012-12-18T22:52:14.637 回答
2

i是一个迭代器,*i是该迭代器指向的对象,并且&*i是该对象的地址。如果迭代器只是一个普通的旧指针,这将是不必要的,但通常不是那么简单。迭代器通常是某种重载的类类型,operator*以允许您访问它所指向的对象。所以这基本上是从迭代器到元素到指向该元素的指针的转换。

我会将增量移到下一行,因为它只会使给定的行更难理解。这将是等效的,因为 的值i++是公正i的,并且增量发生在之后。

于 2012-12-18T22:53:28.403 回答
2

它不一样:i是一个迭代器。取消引用迭代器会产生对某个对象的引用,即,T&对于某个类型的 a T。获取这样一个对象的地址会产生一个T*,即对象在位置 的地址i。迭代器也在同一个表达式中递增只是一个细节,可能是一个坏主意(后递增通常比前递增效率低,并且没有真正需要在代码摘录中对迭代器进行后递增:它也可以在其他位置预先增加)。

于 2012-12-18T22:53:51.587 回答