2012-12-18 77 views
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,然后我要求在给定地址的值,然后我请求此值的地址?!

回答

3

mapVec.begin()返回一个迭代器,它有一个超载的operator++。迭代器的“取消引用”(超载operator*)将访问map对象。参考&是,很好,因为map是一个指针,所以它被分配到从i取消引用的对象的地址。我们不能简单地做i++,因为它仍然是一个迭代器,而不是实际的map对象。

2

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

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

2

这是不一样的:i是一个迭代器。解引用迭代器会产生对某个对象的引用,即T&对于某些类型T。取得这样一个对象的地址产生一个T*,即地址为i的对象的地址。迭代器也在同一个表达式中增加的只是一个细节,可能是一个糟糕的想法(后增量通常效率低于预增量,并且没有真正的需要在迭代器中增加迭代器:它也可以在其他位置预先增加)。