代码之家  ›  专栏  ›  技术社区  ›  Ryan

如何获取vector::reserve()分配的缓冲区地址?

  •  4
  • Ryan  · 技术社区  · 16 年前

    我有一个std::向量值,我知道它的最大大小,但实际大小在使用过程中会有所不同:

    void setupBuffer(const size_t maxSize) {
      myVector.reserve(maxSize);
    }
    
    void addToBuffer(const Value& v) {
      myVector.push_back(v);
    
      if (myVector.size() == maxSize) {
        // process data...
        myVector.clear();
      }
    }
    

    void setupBuffer(const size_t maxSize) {
      myVector.reserve(maxSize);
    
      cachePtr(&(myVector[0])); // doesn't work, obviously
    }
    

    我不想预先调整向量的大小(),因为我想使用vector.size()来表示添加到向量中的元素数。

    那么,有没有办法在分配(reserve())之后但在向量包含任何元素之前获得指向向量缓冲区的指针呢?我可以想象缓冲区存在(并且只要我限制push\u'd值的数量就不会移动)……也许这不能保证?

    4 回复  |  直到 14 年前
        1
  •  4
  •   anon anon    16 年前

    在调用reserve之后,向量缓冲区将不会移动,除非您超出了保留的容量。您的问题是获取指向第一个元素的指针。显而易见的答案是将一个假条目推入向量,得到指向它的指针,然后将其删除。

    一个更好的方法是,如果库接受一个函子而不是一个指针,当它需要访问缓冲区时,它会调用指针-你可以让函子推迟获取地址,直到缓冲区有一些真正的内容。然而,我意识到你没有重写图书馆的奢侈。

        2
  •  2
  •   Community Mohan Dere    9 年前

    不允许。不允许您访问fector中索引大于的任何元素 size . 调整大小是您在这里的唯一选择。

    你能做的是:

    myvec.resize(SOME_LARGE_VALUE);
    myLibrary(&myVec[0]);
    myvec.resize(GetSizeUsedByLibrary());
    

    调整大小时,向量中的元素不会被销毁,但索引高于新大小的元素除外。在resize中设置的数字以下的元素将被单独保留。 Example using std::basic_string , but equally applicable to vector

        3
  •  0
  •   Lou Franco    16 年前

    你试过front()吗?此外,您还可以将一个元素按回原样获取地址,然后将其删除。

        4
  •  -1
  •   Dewfy    16 年前

    周围有很多黑客。但我建议您使用有效的方法-重写分配器,第二个模板参数:

    typedef std::vector<MyItem, MyAllocator> myvector_t;