当向量变满时,它将被重新分配,并且所有迭代器和指向元素的指针都将失效。使用new
创建向量时,此行为是否会以任何方式更改?
std::vector<int>* v = new std::vector<int>(); //What happens if this vector gets reallocated?
我可以从指针中获取对象(作为单独的变量),还是必须将其复制到另一个对象?
答案 0 :(得分:4)
只要v
未被销毁,底层数组(由std::vector
类模板包装)就处于良好状态,无论是否重新分配。
答案 1 :(得分:3)
回答标题问题:是的,动态分配std::vector
对象是安全的(如果不寻常)。
回答身体问题:
如何分配std::vector
对象本身并不会影响其迭代器等的有效性。它们仍然通过重新分配std::vector
的内部数据存储而失效。
对于最后一个问题,我不太明白。 *v
将为您提供动态分配的向量。它不会复制任何东西。例如,(*v)[3]
会在向量中为您提供int
索引3
。
答案 2 :(得分:2)
无论是在堆栈上还是在堆上创建向量都无关紧要。向量实际上拥有存储空间,它可能只是一个分配和重新分配的数组。你拥有的指针是没有改变的所有者。与new
的唯一区别在于您负责释放所有者(可能是所有者释放拥有的内存)。
答案 3 :(得分:0)
使用new是安全的,但对于动态重新分配的问题并没有帮助。矢量对象承诺存储空间的连续性,因此您无能为力。在某些操作之后,您可能不再依赖于迭代器了。要防止在未知时间动态重新分配,请使用reserve()或resize()显式。