C++ 返回从成员映射';什么是迭代器?

C++ 返回从成员映射';什么是迭代器?,c++,memory-management,reference,C++,Memory Management,Reference,如果\u map是类型std::unordered\u map的成员,那么从函数返回对\u map.find(k)->second的引用是否安全,或者这是未定义的行为(或者仅仅是错误的做法) 它看起来像预期的那样工作,但感觉有点像是返回了一个对临时文件的引用。我不确定这是不是真的,或者是否有其他意想不到的后果 #include <unordered_map> class Container { public: using Key = int; // or something

如果
\u map
是类型
std::unordered\u map
的成员,那么从函数返回对
\u map.find(k)->second
的引用是否安全,或者这是未定义的行为(或者仅仅是错误的做法)

它看起来像预期的那样工作,但感觉有点像是返回了一个对临时文件的引用。我不确定这是不是真的,或者是否有其他意想不到的后果

#include <unordered_map>
class Container
{
public:
    using Key = int; // or something more interesting

    // ++++++++++++++++++++++++++++++++++++++++++
    // | Is it safe to return a reference here? |
    // ++++++++++++++++++++++++++++++++++++++++++
    const std::string& get(const Key& k) const
    {
        auto it = _map.find(k);
        return it->second;
    }

    void put(const Key& k, const std::string& v) {
        _map.emplace(k, v);
    }

private:
    std::unordered_map<Key, std::string> _map;
};

int main(int argc, const char * argv[])
{
    Container c;
    c.put(42, "something");

    auto str = c.get(42);

    std::cout << "found " << str << std::endl;
    return 0;
}
#包括
类容器
{
公众:
使用Key=int;//或更有趣的东西
// ++++++++++++++++++++++++++++++++++++++++++
//|在此处返回引用是否安全|
// ++++++++++++++++++++++++++++++++++++++++++
const std::string&get(const Key&k)const
{
autoit=\u map.find(k);
返回->秒;
}
无效放置(常量键和k,常量标准::字符串和v){
_定位图(k,v);
}
私人:
std::无序的_图_图;
};
int main(int argc,const char*argv[]
{
容器c;
c、 put(42,“某物”);
自动str=c.get(42);

std::cout如果返回引用的节点保证留在内存位置(检查容器的文档)或者,如果在返回引用后未修改映射,则返回引用与将引用返回给任何成员一样安全-通常可以,但如果对象本身超出其成员(可能有人会缓存)的引用的范围也是死的

返回本地成员变量的常量引用是不安全的。本地成员变量在超出函数范围时将被释放,其他程序可以使用其内存。没有其他程序使用本地成员变量的内存,因此它可以按预期工作。但它是不可控制和不安全的。您应该更改为l例如:

std::string get(const Key& k) const

检查文档中是否有。在执行使迭代器无效的操作之前,您的引用将保持有效,例如调用
clear
insert
。请注意,如果使用而不是,则迭代器将保持有效,直到该元素从容器中移除。

对于
std,情况并非如此::无序映射
。但它不会返回对局部变量的引用。
是局部变量,但它指向映射中包含的元素,这些元素不会超出函数末尾的范围。