Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/126.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++中的for循环_C++_For Loop - Fatal编程技术网

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不是一个复制构造函数。顺便说一句,或者你在其他地方测试过这个调用吗?