gpt4 book ai didi

c++ - 使用指针写入标准容器

转载 作者:太空宇宙 更新时间:2023-11-04 15:39:19 25 4
gpt4 key购买 nike

我希望能够创建一个固定长度的容器(vectordeque?)来充当缓冲区,然后给另一个对象 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);
}

这将使用 vectordeque 作为缓冲区(或任何其他带有 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com