考虑以下代码 -
{
int n = 3;
n = 5;
std::vector<int> v = { 1, 2, 3 .... 3242};
v = std::vector<int>{10000, 10001, 10002... 50000};
}
对于像int
这样的原始数据类型,它可以简单地用新值覆盖以前的内存位置并远离它。但是,像std::vector
这样的类型会发生什么,其中先前值的长度可能与新赋值的长度不同。
换句话说,当v被重新分配给新的{ 1, 2, 3 .... 3000}
值时,部件{10000, 10001, 10002... 50000}
会发生什么。它是否只是丢弃了之前的值并将内部指针重新分配给新位置?或者它是否尽可能多地使用新数据覆盖以前的位置,并在大量分配的情况下重新分配新内存,或者在分配较短的情况下清除现有内存,从而保留初始向量的capacity()
? p>
除了清除内容(v=vector<int>{}
vs .clear()
)之外,
答案 0 :(得分:3)
然而,像std :: vector这样的类型会发生什么,其中先前值的大小可能与新赋值不同。
我认为你的意思是新数据数组的长度可能不同?
std::vector
将内部存储的关注点与正在使用的存储空间分开。如果新数据具有更少,相同或更多元素,则对象通常会重复使用相同的存储。它比简单地被覆盖更复杂,因为旧对象需要调用它们的析构函数(如果它们不是PODS),但实质上是,是的。它们被覆盖(安全)。
如果你看一下std::vector
的源代码,你会看到很多相当复杂的代码,涵盖了你提到的所有案例,还有一些你没有提到的案例。
编写一个异常安全,最佳效率的向量并非易事。
除非您对实施感兴趣(因为您想要改进它,维护它或者只是好奇),std::vector
行为的文档足以说明您对它的期望。< / p>
特别注意哪些操作会导致迭代器失效。这是一个有用的提示,内部对象要么在存储中移动,要么可以分配新存储。