C++ 分配std::shared#ptr';s用于缓存

C++ 分配std::shared#ptr';s用于缓存,c++,c++11,memory-management,shared-ptr,C++,C++11,Memory Management,Shared Ptr,我有一个元素列表std::vector,我需要将其转换为std::shared\u ptr的列表: auto make_shared(const std::vector<Foo>& foos) { std::vector<std::shared_ptr<Foo>> result(foos.size()); std::transform(std::begin(foos), std::cend(foos), std::begin(resul

我有一个元素列表
std::vector
,我需要将其转换为
std::shared\u ptr
的列表:

auto make_shared(const std::vector<Foo>& foos)
{
    std::vector<std::shared_ptr<Foo>> result(foos.size());
    std::transform(std::begin(foos), std::cend(foos), std::begin(result), 
                   [] (const Foo& foo) { return std::make_shared<Foo>(foo); });
    return result;
}
据我所知,这样做有两个问题:

  • 这些元素在内存中可能彼此不靠近,这意味着
    std::vector
    的大小可能非常大。这可能吗

  • operator正如您所注意到的,std::vector不会为您保存任何内容(作为固定时间的查找),因为向量的大小需要是整个可寻址内存空间(或至少是堆)的大小


    我将重点放在用例上:您是在尝试查找包含Foo的共享_ptr实例的地址,还是其他什么?在前一种情况下,我会从这个角度研究共享的,寻找一个可能的简单解决方案。在后一种情况下,您需要考虑其他设计选项(例如:如果您正在查找SysDypPTR中的“等效”FO,请考虑ID方法,以及STD::MAP查找,或等效).< /P>为什么不通过向量中的索引引用对象?@ KerrekSB,因为向量进一步丢失,指针副本分发到其他对象之后。
    auto complex_calculation(const Foo& foo)
    {
        const auto idx = std::distance(first_foo_ptr_, std::addressof(foo));
        // lookup idx in std::vector...
    }