c – 向量第一指针的变化

c – 向量第一指针的变化,第1张

概述当我使用向量来存储一些数据时,我通常通过向量的第一个条目的指针来访问这些数据.因为它比at()方法更快.但我意识到,当我插入一个数据块时,说一个数组到向量的末尾,第一个条目的指针会改变.这可能是堆栈的东西,但如果我通过push_back一次添加一个元素,第一个指针不会改变.那为什么呢?我应该担心使用指针来访问元素吗? 以下是想要结帐的人的示例代码: int arrayLen = 500000; 当我使用向量来存储一些数据时,我通常通过向量的第一个条目的指针来访问这些数据.因为它比at()方法更快.但我意识到,当我插入一个数据块时,说一个数组到向量的末尾,第一个条目的指针会改变.这可能是堆栈的东西,但如果我通过push_back一次添加一个元素,第一个指针不会改变.那为什么呢?我应该担心使用指针来访问元素吗?

以下是想要结帐的人的示例代码:

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 – 向量第一指针的变化所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1213260.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-04
下一篇 2022-06-04

发表评论

登录后才能评论

评论列表(0条)

保存