gpt4 book ai didi

c++ - 使用基于自动的 Ranged for 循环与使用基于对的 Ranged for 循环

转载 作者:太空狗 更新时间:2023-10-29 20:21:04 27 4
gpt4 key购买 nike

在下面的代码中

#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

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

/*0x10061e410
0x10061e3e0*/

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

ranged for循环有什么区别

最佳答案

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

map 迭代器返回对 std::pair<const std::string, int> 的引用1。你的第一个循环从中构造了一个临时对象(因为你的 std::string 不是 const 限定的)。因此,您不会在第一个循环中打印 map 内的地址对。

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


<子>1 请记住,您不能通过迭代器修改 key 。它会弄乱 map 不变量。

关于c++ - 使用基于自动的 Ranged for 循环与使用基于对的 Ranged for 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46269237/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com