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

我一直在使用相同的std::vector<int>来试图避免分配一个释放所有的时间。 在几行中,我的代码如下所示:

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在这种情况下不是解决方案。 你不想重新调整/清除/(重新)分配吗? 别。

  • fillVector()用每个迭代中已知的元素数填充'矢量'。
  • 向量在内部表示为T *类型的连续内存块。
  • 你不想每次都分配内存。
  • 好。 使用简单的结构:

    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会自动调整大小,并且这种重新分配不在您的控制范围内,因此效率可能非常低。 如果您的阵列相当小并且您可以预测最大需求大小,则始终使用在本地堆栈上创建的固定大小的存储。 它更快,更高效,更简单。 当然这不适用于1.000.000元素的数组(在这种情况下你会得到堆栈溢出)。


    你的代码已经有效( myVector.clear()myVector.resize(0)有更好的风格)。

    'int destructor'什么都不做。
    所以resize(0)只是将size设置为0, capacity不变。


    只是不要继续调整myVector大小。 相反,使用4个元素(使用std::vector<int> myVector(4) )初始化它,并将其分配给元素(例如myVector[0] = 5 )。

    但是,如果它总是固定大小,那么你可能更喜欢使用std::array<int, 4>

    链接地址: http://www.djcxy.com/p/13891.html

    上一篇: Resizing std::vector without destroying elements

    下一篇: Why does object have a pointer and not an int?