gpt4 book ai didi

c++ - 再次获取std::map会更改先前的迭代器

转载 作者:行者123 更新时间:2023-12-02 09:53:51 30 4
gpt4 key购买 nike

我找不到任何类似的问题。
我调用getMap的那一刻,以前的迭代器似乎发生了变化:

//IF I COMMENT THE EVIL PRINT, THE PROBLEM DOES NOT OCCUR
std::cout << "EVIL PRINT" << std::endl;
Something something;
auto mapElement = something.getTheMap().find("A");
std::cout << "Before: " << mapElement->first << std::endl;
something.getTheMap();
std::cout << "After: " << mapElement->first << std::endl << std::endl;

/****************************************************************************************/

//WITH SHARED POINTERS, THE EVIL PRINT IS NOT NECCESARY TO MAKE THE PROBLEM OCCUR
std::shared_ptr<Something> somePtr;
auto mapElement2 = something.getTheMap().find("A");
std::cout << "Before: " << mapElement2->first << std::endl;
something.getTheMap();
std::cout << "After: " << mapElement2->first << std::endl << std::endl;

输出:
EVIL PRINT
Before: A
After: B

Before: A
After: B

完整的代码可在此处运行 https://coliru.stacked-crooked.com/a/66b48636a476ddb7

这是通缉的行为吗?怎么了?

最佳答案

您没有在问题中包括最重要的部分,即

std::map <std::string, int> getTheMap() {
return theMap;
}
getTheMap返回一个副本,因此 getTheMap().find("A");将迭代器返回到一个临时对象(在调用完成后该对象不再存在)。
因此,迭代器引用的对象不再存在,它是一个悬空的迭代器。取消引用它(就像对 mapElement->first一样)会调用未定义的行为

最惯用的解决方法是让 getTheMap返回引用,例如:
std::map <std::string, int>& getTheMap() {
return theMap;
}

关于c++ - 再次获取std::map会更改先前的迭代器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62039880/

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