C++中的for循环
在下面的代码中,我试图编辑无序地图的内容:C++中的for循环,c++,for-loop,C++,For Loop,在下面的代码中,我试图编辑无序地图的内容: class A { public: A() {std::cout << "Constructor called, address=" << this << std::endl;val=1;} int val; }; void main(void) { std::unordered_map<int,A> um; for (int i=0;i<3;i++)
class A {
public:
A() {std::cout << "Constructor called, address=" << this << std::endl;val=1;}
int val;
};
void main(void) {
std::unordered_map<int,A> um;
for (int i=0;i<3;i++)
std::cout << "um[" << i << "]=" << &(um[i]) << ", val=" << um[i].val << std::endl;
for (auto it : um)
std::cout << "&it.second=" << &(it.second) << ", val=" << it.second.val << std::endl;
int index = 1;
for (auto um_it : um)
um_it.second.val = index++;
for (int i=0;i<3;i++)
std::cout << "um[" << i << "]=" << &(um[i]) << ", val=" << um[i].val << std::endl;
for (auto it : um)
std::cout << "&it.second=" << &(it.second) << ", val=" << it.second.val << std::endl;
}
当我将编辑代码替换为:
int index = 1;
for (auto um_it = um.begin(); um_it != um.end(); ++um_it)
um_it->second.val = index++;
输出为:
Constructor called, address=0x9d8b2c
um[0]=0x9d8b2c, val=1
Constructor called, address=0x9d87ac
um[1]=0x9d87ac, val=1
Constructor called, address=0x9d842c
um[2]=0x9d842c, val=1
&it.second=0x7fffd2201c34, val=1
&it.second=0x7fffd2201c34, val=1
&it.second=0x7fffd2201c34, val=1
um[0]=0x9d8b2c, val=3
um[1]=0x9d87ac, val=2
um[2]=0x9d842c, val=1
&it.second=0x7fffd2201c34, val=1
&it.second=0x7fffd2201c34, val=2
&it.second=0x7fffd2201c34, val=3
我从结果中了解到,在第一个版本中,代码会影响对象的副本,但这似乎很奇怪。我还希望调用复制构造函数,但没有。如果有人能解释一下幕后发生的事情,以及在不复制多余副本的情况下迭代无序地图的最佳方式,我会很高兴的。行中:
for (auto um_it : um)
它不是迭代器。它是映射中某个值的副本。然后在循环体中修改该副本,使贴图保持不变。这将为每次迭代调用的副本构造函数
相反,您可以通过引用进行操作:
for ( auto& um_item : um )
当um_项引用地图中的条目时。使用基于范围的for循环时,无法访问基础迭代器,只能访问每个元素或其副本。行中:
for (auto um_it : um)
它不是迭代器。它是映射中某个值的副本。然后在循环体中修改该副本,使贴图保持不变。这将为每次迭代调用的副本构造函数
相反,您可以通过引用进行操作:
for ( auto& um_item : um )
当um_项引用地图中的条目时。使用基于范围的for循环时,您无法访问底层迭代器,只能访问每个元素或其副本。谁教您void mainvoid?别听那个人说了。正确的定义是int main。你可以避免使用auto的复制&it:umA不是复制构造函数。顺便说一句,或者你在其他地方测试过这个调用吗?谁教你void mainvoid的?别听那个人说了。正确的定义是int main。你可以避免使用auto的复制&it:umA不是一个复制构造函数。顺便说一句,或者你在其他地方测试过这个调用吗?