C++ 您应该使用std::无序映射迭代器的引用吗?
我目前正在调试一个开源游戏中的崩溃,令人不快的是:C++ 您应该使用std::无序映射迭代器的引用吗?,c++,c++11,for-loop,reference,C++,C++11,For Loop,Reference,我目前正在调试一个开源游戏中的崩溃,令人不快的是: for( auto &special: special_attacks ) { 其中,特殊攻击定义如下: std::unordered_map<std::string, mon_special_attack> special_attacks; std::无序映射特殊攻击; 我怀疑这里的问题是,由于special是一个迭代器而不是一个值,因此此代码实际上可能正在创建对内部special\u攻击的返回值的引用。begin(
for( auto &special: special_attacks ) {
其中,特殊攻击
定义如下:
std::unordered_map<std::string, mon_special_attack> special_attacks;
std::无序映射特殊攻击;
我怀疑这里的问题是,由于special
是一个迭代器而不是一个值,因此此代码实际上可能正在创建对内部special\u攻击的返回值的引用。begin()
调用。忽略和会导致功能代码(修改特殊。第二个也会修改无序映射中的副本)这一事实支持了这种怀疑
因此,当在std::unordered_map
上迭代时,我们是否应该始终使用迭代器的值而不是引用
…因为special是迭代器而不是值
不,不是。special\u攻击的值类型将是std::pair
,因此auto&special
将具有类型std::pair&
(可能参考const)。这不是迭代器-您的bug在其他地方
根据您的描述,我怀疑特殊_攻击
实际上是常量
,因此您通过常量引用修改值的尝试无法编译。re“special是迭代器”,不,不是。例如,它显示了一个示例实现,该实现将向您显示特殊
(在您的案例中)不是迭代器。哦,你说得对,它只是一对。。天啊,汽车有时让我哑巴。现在特别奇怪的是,不使用引用仍然允许我修改容器中的值。啊。。没关系,我读错了调试输出。。我的错,是的,我的错。你不认为还有什么需要补充的吗?你的编辑:不,它编译得很好,只是崩溃了。。在迭代过程中似乎有什么东西在修改容器,这很奇怪,因为密钥总是作为常量提取。但是谢谢你。