以下是想要结帐的人的示例代码:
int arrayLen = 500000; vector<int> vint = vector<int>(2000,0); int * firstEntry = &vint[0]; int * iarray = new int[arrayLen]; for(int i = 0; i< arrayLen; i++) { iarray[i] = i; } vint.insert(vint.end(),iarray,iarray+arrayLen); cout << firstEntry << "," << &vint[0] << endl; // They ar not equal; // reset the vector vint.clear(); vint.resize(2000,0); firstEntry = &vint[0]; for(int i = 0; i< arrayLen; i++) { vint.push_back(iarray[i]); if(firstEntry != &vint[0]) cout << firstEntry << "," << &vint[0] <<","<< i << endl; }// nothing is written cout << firstEntry << "," << &vint[0] << endl; // Now they are equal;解决方法 std :: vector可以动态调整大小.它的方式是保持比所需更多的空间.一旦达到保留容量,就需要保留更大的数据块(取决于实现,但新块的容量通常是之前大小的两倍).然后将数据复制到新位置,这就是第一个元素的地址发生变化的原因.
如果不向向量添加更多数据,则无需担心向量中的数据指针无效.您可以通过检查vint.capacity()== vint.size()来预测何时进一步的push_back()将触发调整大小.您也可以通过始终使用最新的via& vint [0](或& vint.at()来获取范围检查)而不是复制它来避免使用无效指针.
如果您知道要插入一些新项目,则可以通过使用reserve()预分配空间(如果当前容量小于请求的容量)来确保您有足够的容量.但要注意你不想这样做 – 例如
vint.reserve(vint.size() + 2000);for(int i=0; i<2000; ++i) { vint.push_back(i);}
没关系,但是
for(int i=0; i<2000; ++i) { vint.reserve(vint.size() + 1); vint.push_back(i);}
因为你反复要求 *** 作系统获得更多内存并且每次迭代都会产生越来越大的复制 *** 作,所以会造成性能拖累.
总结以上是内存溢出为你收集整理的c – 向量第一指针的变化全部内容,希望文章能够帮你解决c – 向量第一指针的变化所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)