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

时间:2010-07-28 12:32:30

标签: 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();
  }
}

但是,在setupBuffer中,我需要获取指向myVector数据开头的指针。我正在使用第三方库,我必须在前面缓存此指针,以便在“过程数据...”部分进行的调用中使用。

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

  cachePtr(&(myVector[0])); // doesn't work, obviously
}

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

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

4 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:2)

没有。您不能使用索引大于size的格式访问fector中的任何元素。调整大小是您唯一的选择。

你可以做的是:

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

调整大小时,矢量中的元素不会被销毁,除了那些索引高于新大小的元素。调整大小中设置的数字下面的元素是单独的。 Example using std::basic_string, but equally applicable to vector

答案 2 :(得分:0)

你尝试过前()吗?此外,你可以push_back一个元素,像你一样获取地址,然后将其删除。

所有这些都无法保证,但您可以阅读矢量的来源<>如果你必须这样做,看看它对你是否合适。你也可以很容易地滚动自己的矢量,它有一个指向数据的指针,永远不会移动它。

答案 3 :(得分:-1)

周围有很多黑客攻击。但我建议你使用有效的方法 - 覆盖分配器,第二个模板参数:

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

在MyAllocator中提供固定缓冲区分配后,将此分配器实例作为vector的构造函数的arguemnt传递