加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 向量第一指针的变化

发布时间:2020-12-16 09:30:32 所属栏目:百科 来源:网络整理
导读:当我使用向量来存储一些数据时,我通常通过向量的第一个条目的指针来访问这些数据.因为它比at()方法更快.但我意识到,当我插入一个数据块时,说一个数组到向量的末尾,第一个条目的指针会改变.这可能是堆栈的东西,但如果我通过push_back一次添加一个元素,第一个
当我使用向量来存储一些数据时,我通常通过向量的第一个条目的指针来访问这些数据.因为它比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);
}

因为你反复要求操作系统获得更多内存并且每次迭代都会产生越来越大的复制操作,所以会造成性能拖累.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读