我希望能够创建一个固定长度的容器(vector
?deque
?)来充当缓冲区,然后给另一个对象 vector a指向允许写入的缓冲区位置的指针。
示例(不可编译代码)
class Item {
*p //pointer to a place in the vector
vector<int> values
}
vector<Item> items;
for(auto item : items) {
for(auto value : values) {
buffer[p] = item->value
++(item->p);
}
}
但是,我不确定如何明确每个 Item
应该在缓冲区中开始写入的位置。
我应该注意,对于 items
的每次迭代,最终缓冲区都有一个已知的固定大小——但在函数调用之间,Items
的数量可能会改变。
谢谢,
最佳答案
如果我正确理解了这个问题(我不确定),你应该使用索引,而不是指针或迭代器,因为它是相对于缓冲区开始的偏移量,而不是绝对偏移量地址将因更改缓冲区而失效。
class Item
{
size_t pos; // index into the buffer
vector<int> values;
};
vector<Item> items;
// ...
std::vector<int> buffer;
buffer.resize(N);
for (auto& item : items)
{
assert(buffer.size() >= (item.pos + item.values.size()));
std::copy(std::begin(item.values), std::end(item.values),
std::begin(buffer)+item.pos);
}
这将使用 vector
或 deque
作为缓冲区(或任何其他带有 RandomAccessIterators 的东西),但因为您似乎不需要添加/删除缓冲区开头的元素(只调整一次大小并分配给现有元素)那么就没有理由使用 deque。因此,您应该更喜欢
vector`,它通常应该是您的默认容器选择,除非您需要其他容器之一的特定特征。
我不知道你打算如何设置 Item::pos
值,也许这会有意义:
size_t pos = 0;
for (auto& item : items)
{
item.pos = pos;
pos += item.values.size();
assert(buffer.size() >= pos);
std::copy(std::begin(item.values), std::end(item.values),
std::begin(buffer)+item.pos);
}
这会将每个项目依次放入缓冲区,并动态记录位置。
这甚至可以在事先不知道总缓冲区大小的情况下工作,根据需要调整缓冲区的大小:
size_t pos = 0;
for (auto& item : items)
{
item.pos = pos;
pos += item.values.size();
if (buffer.size() < pos)
buf.resize(pos);
std::copy(std::begin(item.values), std::end(item.values),
std::begin(buffer)+item.pos);
}
因为您存储的是索引,而不是绝对地址,所以即使在调整缓冲区大小并将其内容重新定位到不同的内存块后,它仍会继续工作。
关于c++ - 使用指针写入标准容器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26287637/