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

Rya*_*yan 5 c++ stl vector

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

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();
  }
}
Run Code Online (Sandbox Code Playgroud)

但是,在 setupBuffer 中,我需要获取指向 myVector 数据开头的指针。我正在使用第三方库,我必须预先缓存该指针,以便在“处理数据...”部分期间进行的调用中使用。

void setupBuffer(const size_t maxSize) {
  myVector.reserve(maxSize);

  cachePtr(&(myVector[0])); // doesn't work, obviously
}
Run Code Online (Sandbox Code Playgroud)

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

那么,有什么方法可以在分配(reserve())之后但在它有任何元素之前获取指向向量缓冲区的指针吗?我想象缓冲区存在(并且只要我限制 push_back'd 值的数量就不会移动)......也许这不能保证?

小智 4

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

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

  • @sbi:如果您获得指向假元素的指针,删除假元素,然后插入真实元素,则您获得的指向假元素的指针可以安全地用于引用真实元素(参见§3.8/7)。当然,如果您尝试在删除假元素和插入真实元素之间取消引用指针,那么您肯定会遇到未定义的行为。 (2认同)