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

标签 c++ pointers vector iterator

我希望能够创建一个固定长度的容器(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/

相关文章:

C++:模拟 RTTI

c++ - 我不明白编译器错误

c - 堆栈溢出与 C 中的指针

C++ vector 错误 C2036 : 'int (*)[]' : unknown size

c++ - QTreeWidgetItem 更改 - 检测 Enter/ESC

c++ - 模板化函数的C++模板子类参数

c - 为什么我的代码不打印排序数组?

c - 如何在 C 中使用 while 声明多个指针到指针?

c++ - 在 C++ 中创建一个指向另一个元素的 vector

c++ - 将 vector<Derived*> 放入需要 vector<Base*> 的函数中