2016-02-18 110 views

回答

5

作爲您vector在乍得,您的for循環迭代的答案所述,使用其beginend迭代器。這是冒號:語法的行爲。

關於你const auto &語法:你應該想象來自哪個碼出來的:

// "i" is an iterator 
const auto& ioDev = *i; 

表達*i爲(a參考)在容器中的元素的類型:Device *。這是推斷的類型auto。因爲你const &附加到auto,變量ioDevconst參考推導型(指針),就好像它是這樣聲明:

const Device *& ioDev = *i; 

似乎不必要的複雜;如果你只需要正常的迭代(而不是如操縱指針的地址,我認爲這是極不可能的),使用普通的未修改auto

for (auto ioDev : deviceList) 

或顯式類型:

for (Device* ioDev : deviceList) 
9

這是一個基於for循環的範圍,它具有相同的基本行爲:基於循環很快就成爲我最喜歡的結構之一

for(auto it = deviceList.begin(); it != deviceList.end(); ++it) 
{ 
    const auto& ioDev = *it; 
} 

範圍,它的簡潔,當你需要遍歷的整個範圍內,儘可能(並且儘可能高效)地工作。

如果你需要一個典型的for循環的其他結構(說在某些情況下提前退出),然後基於範圍的不是該用例。

+0

離開由於特定條件的範圍爲基礎的循環可以仍然很容易地通過使用'break'完成。恕我直言,在循環體的額外'if'聲明仍然比構建一個「傳統」的for循環與特定的停止條件乾淨多了。根據我的經驗,對於「傳統」for循環的需求大多數是在容器在循環體中發生變異時產生的。 – schlimmchen

2

「新」 for循環簡單地在的deviceList所有元素進行迭代。在循環體的每次迭代中,ioDev是對deviceList中的每個元素的連續引用。

至於ioDev類型:它是Device *const &類型的,因爲你可以在下面看到:

#include <vector>                                                
#include <type_traits> 


using namespace std; 


int main() 
{ 
    vector<int *> v; 

    for(const auto &r: v) 
    { 
     static_assert(is_same<decltype(r), int *const &>::value, "wrong type"); 
    } 
}