【问题标题】:in c++, iterator, why sometime I use it and sometimes use *it?在 C++ 中,迭代器,为什么有时我使用它,有时使用 *it?
【发布时间】:2015-02-06 04:16:19
【问题描述】:

这个用*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';

【问题讨论】:

  • 你知道-&gt;是做什么的吗?

标签: c++ pointers iterator


【解决方案1】:

语法it-&gt;first 等价于(*it).first。无论哪种情况,您都在取消对迭代器的引用。

【讨论】:

    【解决方案2】:

    迭代器的语义是指针。所以想象你在每个元素上都有一个指针。如果您有一个指向向量元素的指针 it,则可以使用 * 运算符取消引用它并获取该元素。指向映射元素的指针也是如此,它是一个键/值对。所以取消引用地图元素上的指针,你会得到std::pair。密钥可以通过it-&gt;first(*it).first 访问,值it-&gt;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';
    

    【讨论】:

      【解决方案3】:

      它们是等价的。 *it 取消对迭代器的引用,it-&gt; 做同样的事情。

      我们可以将第二个例子改写为:

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

      在我看来,-&gt; 运算符更简洁。无论如何,有些人总是使用(*it)。纯粹的风格偏好。

      【讨论】:

        【解决方案4】:
        • it 是指向(迭代器)的指针
        • *it

        阅读:understanding-iterators-in-STL

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-03-23
          • 1970-01-01
          • 1970-01-01
          • 2010-09-15
          • 1970-01-01
          • 2016-01-11
          • 1970-01-01
          相关资源
          最近更新 更多