小编Vla*_*bin的帖子

从std :: copy和std :: copy_n中提取输入迭代器

我试图实现一个反序列化方法,它接受一个输入迭代器并执行一系列块读取(使用std::copystd::copy_n).像这样的东西(只是一个例子):

template <class InputIt>
InputIt unserialize(InputIt it)
{
  std::copy_n(it, sizeof(header_type), reinterpret_cast<char*>(&header));
  std::copy_n(it, header.payload_size, std::back_inserter(payload));
  it = optional.unserialize(it);
  return it;
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下如何提前输入迭代器,以便每次跟随调用std::copy_n继续从中读取并最终返回它?

出于性能原因,我希望对迭代器类别(尤其是RandomAccessIterator和InputIterator)具有通用性,并希望可以使用std::copy方法而无需重写这些方法.像绑定检查这样的东西将由迭代器适配器完成,或者如果已知大小,则在反序列化调用之前检查.

什么不起作用也不可接受:

  1. 使用std::copy_n<InputIt&>(it, ...)可能适用于某些类别但不适用于所有类别,并且它太不可靠.
  2. std::advance在每次调用之后使用会导致为某些迭代器重新读取相同的块.不是优选的,对某些来源可能是不可能的.

UPDATE使得迭代器引用适配器没有帮助,因为随机访问迭代器版本的copy_n返回指针超过复制的最后一个元素,而输入迭代器版本返回指向复制的最后一个元素的指针.所以我想自己的版本copy_n最适合使用额外的迭代器适配器进行绑定检查.

c++ iterator stl

7
推荐指数
1
解决办法
377
查看次数

标签 统计

c++ ×1

iterator ×1

stl ×1