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()};
}


以上是C++:将std::map&lt;std::string,double&gt;转换为std::map&lt;std::string_view,double&gt;的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>