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

c – 在不破坏元素的情况下调整std :: vector的大小

发布时间:2020-12-16 10:25:47 所属栏目:百科 来源:网络整理
导读:我一直在使用相同的std :: vector int为了尽量避免一直分配deallocating.在几行中,我的代码如下: std::vectorint myVector;myVector.reserve(4);for (int i = 0; i 100; ++i) { fillVector(myVector); //use of myVector //.... myVector.resize(0);} 在每
我一直在使用相同的std :: vector< int>为了尽量避免一直分配deallocating.在几行中,我的代码如下:

std::vector<int> myVector;
myVector.reserve(4);

for (int i = 0; i < 100; ++i) {
    fillVector(myVector);
    //use of myVector
    //....
    myVector.resize(0);
}

在每次迭代中,myVector最多将填充4个元素.为了制作高效的代码,我想总是使用myVector.但是,在myVector.resize()中,myVector中的元素正在被销毁.我知道myVector.clear()会产生同样的效果.

我想如果我可以覆盖myVector中的现有元素,我可以节省一些时间.但是我认为std :: vector无法做到这一点.

有没有办法做到这一点?创建一个覆盖元素的本土实现是否有意义?

解决方法

在这种情况下,std :: vector不是解决方案.你不想重新调整/清除/(de)重新分配?别.

> fillVector()用每次迭代中已知的元素数填充’vector’.
>向量在内部表示为T *类型的连续内存块.
>您不希望每次(de)分配内存.

好.使用简单的结构:

struct upTo4ElemVectorOfInts
{
  int data[4];
  size_t elems_num;
};

并修改fillVector()以保存其他信息:

void fillVector(upTo4ElemVectorOfInts& vec)
{
  //fill vec.data with values
  vec.elems_num = filled_num; //save how many values was filled in this iteration
}

以同样的方式使用它:

upTo4ElemVectorOfInts myVector;

for (int i = 0; i < 100; ++i)
{
  fillVector(myVector);
  //use of myVector:
  //- myVector.data contains data (it's equivalent of std::vector<>::data())
  //- myVector.elems_num will tell you how many numbers you should care about
  //nothing needs to be resized/cleared
}

附加说明:

如果您想要更通用的解决方案(对任何类型或大小进行操作),您当然可以使用模板:

template <class T,size_t Size>
struct upToSizeElemVectorOfTs
{
  T data[Size];
  size_t elems_num;
};

并调整fillVector()以接受模板而不是已知类型.

这个解决方案可能是最快的.你可以这样想:“嘿,如果我想填充100个元素?1000?10000?那么呢?10000-elem数组将消耗大量存储空间!”.
无论如何它会消耗. Vector会自动调整大小,并且此reallocs不受您的控制,因此效率非常低.如果您的阵列相当小并且您可以预测所需的最大大小,请始终使用在本地堆栈上创建的固定大小的存储.它更快,更高效,更简单.当然这不适用于1.000.000元素的数组(在这种情况下你会得到Stack Overflow).

(编辑:李大同)

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

    推荐文章
      热点阅读