如果我正确地理解了这个问题(我不确定),你应该使用索引而不是指针或迭代器,因为它是一个相对于缓冲区开始的偏移量,而不是绝对地址将被缓冲区的更改无效。
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)工作,但你似乎并不需要在缓冲区的开头添加/移除元素(只调整它曾经并分配给现有的元素),那么没有理由使用矢量,这通常应该是你的容器的默认选择,除非你需要其他容器的特定特性。
我不知道您打算如何设定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);
}
因为你存储的索引,而不是一个绝对地址,它会继续工作即使在缓冲区被调整大小并且其内容被重新定位到不同的内存块之后。
你的意思是一样的std ::阵列? – stonemetal 2014-10-09 20:48:05
我不认为'的std :: array'会的工作,因为每次迭代在我的项目,最后的缓冲区大小是已知的,但功能之间的呼叫'items'可以改变大小。我也不知道如何给每个'Item'一个指向它应该开始写的地方的指针。 – 2014-10-09 20:51:22
'然后用指针来有项目写入向量的某些部分如果被矢量调整创造buffer',你所设置的指针最终可能指向垃圾,因为一个矢量的迭代器变得无效。 – PaulMcKenzie 2014-10-09 20:54:49