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