C++:将std::map<std::string,double>转换为std::map<std::string_view,double>
假设std::map
我的班级中有一个 private std::map<std::string, double>
。我怎样才能转化为std::map<std::string_view, double>
返回给用户?我想在这里有以下原型
const std::map<std::string_view, double>&
MyClass::GetInternalMap() const;
回答
你不应该map
通过 const 引用返回新的。您将返回对退出map
时被破坏的临时值的悬空引用GetInternalMap()
。如果要返回 const 引用,则应按map
原样返回源,例如:
const std::map<std::string, double>& MyClass::GetInternalMap() const
{
return myvalues;
}
否则,map
改为按值返回新的:
std::map<std::string_view, double> MyClass::GetInternalMap() const;
话虽如此, astd::map<std::string,double>
不能直接转换为 a std::map<std::string_view,double>
,因此您必须一次手动迭代源map
一个元素,将每个元素分配给 target map
,例如:
std::map<std::string_view, double> MyClass::GetInternalMap() const
{
std::map<std::string_view, double> result;
for(auto &p : myvalues) {
result[p.first] = p.second;
// or: result.emplace(p.first, p.second);
}
return result;
}
幸运的是, astd::pair<std::string,double>
可以隐式转换为 a std::pair<std::string_view,double>
,因此您可以简单地使用将map
迭代器范围作为输入的构造函数,然后map
为您分配元素,例如:
std::map<std::string_view, double> MyClass::GetInternalMap() const
{
return {myvalues.begin(), myvalues.end()};
}
THE END
二维码