我有一个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值的数量就不会移动)....也许这不保证?
答案 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传递