【发布时间】:2013-11-28 11:36:08
【问题描述】:
背景
我有一个对象向量和一个按名称(字符串)指向这些对象的索引(映射)。 在我的例子中,向量只会增长(项目永远不会被删除)。
我不知道这个
struct Foo { };
std::vector<Foo> v;
std::map<std::string,Foo*> m; // addresses are &v[0], &v[1], etc...
因为当我将项目添加到 v 时,如果 v 被重新分配,m 中的旧映射可能会失效。
问题
如果我通过std::unique_ptr<> 添加额外的抽象级别,m 是否应该重新分配v?
struct Foo { };
std::vector<std::unique_ptr<Foo>> v;
std::map<std::string,Foo*> m; // addresses are v[0].get(), v[1].get(), etc...
由于复制省略,我认为答案是肯定的,但我不确定。
【问题讨论】:
-
除非您确实需要将向量中的项目存储在连续的内存区域中,否则您可能需要查看
std::deque。指向双端队列(或迭代器)中元素的指针永远不会失效(当然,除非元素被删除)。 -
std::map<std::string,int>怎么样,其中整数是向量的索引。那么重新分配就没有问题了。 -
@john 是的,我考虑过索引/间接 - 我只是想知道上述解决方案是否可以解决问题
-
@JoachimPileborg 我喜欢
std::deque的想法-谢谢! -
您使用
std::暗示 C++ 标准库,而不是 STL。
标签: c++ memory-management c++11 stl