我有一段代码,我首先将一些值放入std::vector
,然后将其中每个值的地址提供给将要使用它们的对象之一,如下所示:
std::vector < useSomeObject > uso;
// uso is filled
std::vector < someObject > obj;
for (int i=0; i < numberOfDesiredObjects; ++i){
obj.push_back(someObject());
obj.back().fillWithData();
}
for (int i=0; i < numberOfDesiredObjects; ++i){
uso[i].setSomeObject(&obj[i]);
}
// use objects via uso vector
// deallocate everything
现在,因为我有时候是一个风格怪物,我认为这是丑陋并且只想使用1 for for循环,有点像这样:
for (int i=0; i < numberOfDesiredObjects; ++i){
obj.push_back(someObject());
obj.back().fillWithData();
uso[i].setSomeObject(&obj.back());
}
当然,我不能这样做,因为偶尔会发生重新分配,并且我设置的所有指针都变得无效。
所以,我的问题是:
我知道如果您知道需要多少并希望提前分配内存,那么std::vector.reserve()
就是您的选择。如果我确定我正在尝试使用reserve()
提前分配足够的内存,是否可以保证我的指针保持有效?
谢谢。
Sidenote。 This是一个类似的问题,但我想知道的是没有答案。只是为了防止它弹出作为对这个问题的第一个评论。
答案 0 :(得分:5)
事实上,这是使用reserve
的主要原因之一。您
保证追加到std::vector
的末尾不会
使向量中的元素的迭代器,引用或指针无效
只要矢量的新大小不超过旧容量。
答案 1 :(得分:4)
如果我确保我尝试使用reserve()预先分配足够的内存,这是否可以保证我的指针保持有效?
是的,它保证你的指针保持有效,除非:
迭代器矢量的失效规则在 23.2.4.3/1 &amp;中指定。 23.2.4.3/3 as:
插入点之前的所有迭代器和引用都不受影响,除非新容器大小大于先前的容量(在这种情况下,所有迭代器和引用都无效)
擦除点后的每个迭代器和引用都无效。