2012-12-18 76 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的對象的地址。迭代器也在同一個表達式中增加的只是一個細節,可能是一個糟糕的想法(後增量通常效率低於預增量,並且沒有真正的需要在迭代器中增加迭代器:它也可以在其他位置預先增加)。