2015-02-06 57 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。无论哪种情况,您都要解除迭代器的引用。

相关问题