【问题标题】:Using Auto based Ranged for loop vs using pair based Ranged for loop使用基于自动的 Ranged for 循环与使用基于对的 Ranged for 循环
【发布时间】:2017-09-17 21:55:52
【问题描述】:

在下面的代码中

#include <iostream>
#include<unordered_map>
#include<string>

int main()
{
    std::unordered_map<std::string,int>m;
    m["1"]=1;
    m["2"]=2;

    for(const std::pair<std::string,int>&p :m)
    {
        std::cout<<&p<<"\n";
        /*0x7fff5fbff068
          0x7fff5fbff068*/
    }

    for(const auto &p :m)
    {
        std::cout<<&p<<"\n";
        /*0x10061e410
         0x10061e3e0*/
    }

}

如果我使用基于普通对的范围 for 循环,它会显示两次迭代的相同地址

0x7fff5fbff068
0x7fff5fbff068

而如果我使用自动,则两次迭代的地址都会更改

/*0x10061e410
  0x10061e3e0*/

为什么在行为上存在差异。即使在基于范围的 for 循环中使用对,两者也不应该显示不同的地址。

这两种范围的for循环有什么区别

【问题讨论】:

标签: c++


【解决方案1】:

嗯,事情就是这样。您的两个循环不使用相同类型的元素。

映射迭代器返回对std::pair&lt;const std::string, int&gt;1 的引用。并且您的第一个循环从中构造一个临时对象(因为您的 std::string 不是 const 限定的)。因此,您不会在第一个循环中在地图内打印该对的地址。

编译器在每次迭代时巧妙地使用相同的存储来构造临时对象并非不可能,因此您总是会看到打印的相同地址。


1 你不能通过迭代器修改键,记住。它会弄乱地图不变量。

【讨论】:

  • 你的意思是说每次循环它都会创建一个新的临时对象?不小心使用了相同的临时对象..如果我添加 std::pair 没有临时对象将被创建..
  • @HariomSingh - “使用std::pair&lt;const std::string, int&gt;”是什么意思?如果元素类型未声明为引用,您仍然会有临时对象。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-31
  • 2016-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多