【发布时间】:2017-08-10 04:02:30
【问题描述】:
我有一个元素列表 std::vector<Foo>,我需要将其转换为 std::shared_ptr<Foo> 的列表:
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::unordered_map 使用缓存中指向元素的地址。我发现访问地图很昂贵,并且想知道是否可以用std::vector 替换它,因为我知道在第一次缓存查找之前所有元素的地址:
auto complex_calculation(const Foo& foo)
{
const auto idx = std::distance(first_foo_ptr_, std::addressof(foo));
// lookup idx in std::vector...
}
据我所知,这样做有两个问题:
- 元素在内存中的位置可能不会彼此靠近,这意味着
std::vector的大小可能非常大。这可能吗 -
operator<(或std::less)不适合根据地址顺序计算偏移量。
在这种情况下是否可以使用自定义分配器来解决这两个问题?
【问题讨论】:
-
为什么不在向量中通过对象的索引来引用对象?
-
@KerrekSB 因为在将指针的副本分发给其他对象之后,向量会进一步丢失。
标签: c++ c++11 memory-management shared-ptr