gpt4 book ai didi

c++ - 在 map 上使用 foreach 的意外拷贝

转载 作者:IT老高 更新时间:2023-10-28 22:19:16 26 4
gpt4 key购买 nike

我正在尝试遍历 map 的条目,但我得到了意外的拷贝。这是程序:

#include <iostream>
#include <map>
#include <string>

struct X
{
X()
{
std::cout << "default constructor\n";
}

X(const X&)
{
std::cout << "copy constructor\n";
}
};

int main()
{
std::map<int, X> numbers = {{1, X()}, {2, X()}, {3, X()}};
std::cout << "STARTING LOOP\n";
for (const std::pair<int, X>& p : numbers)
{
}
std::cout << "ENDING LOOP\n";
}

这是输出:

default constructor
copy constructor
default constructor
copy constructor
default constructor
copy constructor
copy constructor
copy constructor
copy constructor
STARTING LOOP
copy constructor
copy constructor
copy constructor
ENDING LOOP

为什么我会在循环中得到三个拷贝?如果我使用类型推断,拷贝就会消失:

for (auto&& p : numbers)
{
}

这是怎么回事?

最佳答案

map<K,V> 的值类型是 pair<const K,V> ;所以你的循环需要转换 pair<const int,X>pair<int,X> ,复制键和值,为您提供对该类型的引用。

使用正确的类型(明确指定,或用 auto 推断)将删除拷贝。

关于c++ - 在 map 上使用 foreach 的意外拷贝,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20709342/

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