在c ++中,迭代器,为什么有时我会使用它,有时使用*它?

时间:2015-02-06 04:16:19

标签: c++ pointers iterator

这个使用* it

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';

4 个答案:

答案 0 :(得分:3)

语法it->first相当于(*it).first。在任何一种情况下,您都要取消引用迭代器。

答案 1 :(得分:2)

迭代器的语义是指针。所以想象一下,每个元素都有一个指针。如果向量的元素有一个指针it,则可以使用*运算符取消引用它并获取该元素。对于指向map元素的指针也是如此,它是一个键/值对。因此,取消引用地图元素上的指针,您将获得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 << ' ' << elem;

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

答案 2 :(得分: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 :(得分:1)

  • it是指向(迭代器)的指针
  • *it

阅读:understanding-iterators-in-STL