2015-02-06 29 views
0

這一個使用*它在c + +,迭代器,爲什麼有時我使用它,有時使用*它?

int main() 
{ 
    std::vector<int> myvector; 
    for (int i=1; i<=5; i++) myvector.push_back(i); 

    std::cout << "myvector contains:"; 
    for (std::vector<int>::iterator it = myvector.begin() ; it != myvector.end(); ++it) 
    std::cout << ' ' << *it; 
    std::cout << '\n'; 

    return 0; 
} 

這使用它。

for (std::map<char,int>::iterator it=mymap.begin(); it!=mymap.end(); ++it) 
    std::cout << it->first << " => " << it->second << '\n'; 
+0

你知道' - >'嗎? – immibis 2015-02-06 04:33:14

回答

2

迭代器的symantics是指針。所以想象你在每個元素上都有一個指針。如果您有一個指向it的向量元素,則可以使用*運算符對其進行解引用並獲取該元素。指向地圖元素的指針也是一樣,這是一個鍵/值對。因此,取消引用地圖元素上的指針,您會得到std::pair。密鑰可通過it->first(*it).first,值it->second(*it).second訪問。

for (std::map<char,int>::iterator it = mymap.begin(); it != mymap.end(); ++it) 
    std::cout << (*it).first << " => " << (*it).second << '\n'; 

或更好地利用汽車類型推演,而不是寫迭代器類型明確的(如果你的編譯器支持C++ 11):

for (auto it = mymap.begin(); it != mymap.end(); ++it) 
    std::cout << (*it).first << " => " << (*it).second << '\n'; 

甚至更​​好的使用新的語法(因爲C++ 11 ),因爲它更清晰和更短:

for (const auto& elem: myvector) 
    std::cout << ' ' << it; 

for (const auto& elem: mymap) 
    std::cout << elem.first << " => " << elem.second << '\n'; 
1

它們是等價的。 *it解引用迭代器,並且it->做同樣的事情。

,我們可以把第二個例子是:

for (std::map<char,int>::iterator it=mymap.begin(); it!=mymap.end(); ++it) 
    std::cout << (*it).first << " => " << (*it).second << '\n'; 
     //  ^^^^^^     ^^^^^^ 

->運營商只是在我看來更清潔。無論如何,有些人總是使用(*it)。純粹的風格偏好。

3

語法it->first相當於(*it).first。無論哪種情況,您都要解除迭代器的引用。

相關問題