gpt4 book ai didi

c++ - 将 try_emplace 与 shared_ptr 一起使用

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

所以我有一个 std::unordered_map<std::string, std::shared_ptr<T>>我想使用try_emplace添加/引用元素。以前,它只是一个 std::unordered_map<std::string, T>T有一个构造函数,只需要 std::string ,所以我使用 myMap.try_emplace(myString, myString).first->second引用T并在必要时创建它。

但是,如果我简单地将其更改为 myMap.try_emplace(myString, std::make_shared<T>(myString)).first->second ,它当然构造了 T每次。

解决这个问题最惯用的方法是什么?为了澄清这一点,我想使用共享指针在堆上构造对象,并当且仅当映射中尚不存在匹配元素时将共享指针插入无序映射中。

最佳答案

您可以使用operator[]代替:

auto &ptr = map[ key ];
if( !ptr ) ptr = std::make_shared<T>( myString );

注意:此解决方案假设您不想在 map 中保留默认构造的 std::shared_ptr 。如果是这种情况,那么您需要在 try_emplace 中使用更详细的代码:

auto p = map.try_emplace( key, nullptr );
if( p.second ) p.first->second = std::make_shared<T>( myString );
else {
if( !p.first->second ) { // handle nullptr }
}
auto &ptr = p.first->second;

关于c++ - 将 try_emplace 与 shared_ptr 一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50931315/

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