专门为自定义迭代器添加std :: copy

时间:2018-11-15 12:22:05

标签: c++ iterator template-specialization

据我所知,可以write template specializations来获取std名称空间中的函数模板。我编写了一个CircularBuffer<T>类,并为此类实现了一个随机访问迭代器。 std::copy()算法也可以与我的自定义迭代器一起使用,但这并不是最佳方法。它遍历该范围并逐个复制元素。通过在内部指针上使用std::memcpy(),我可以为平凡可复制的类型编写更理想的实现。

我的问题是可能吗?我知道如何使用输出迭代器作为模板参数来创建std::copy()作为模板的重载。但这无法完成,因为您只能在std名称空间中编写功能模板的模板特化。为我指明正确方向的任何帮助都会有所帮助。从我可以通过Google收集的信息来看,这是无法完成的,但是我很想证明自己是错误的:)

1 个答案:

答案 0 :(得分:1)

也许您的问题应该是:我应该这样做吗?

使用您的课程的用户应该已经知道std::copy是什么,它如何工作以及对性能的内在影响。因此,提供专业化会使情况变得更糟。 std::copy 保证:进行了N次分配;根据{{​​3}}:

  

恰好(last - first)个分配

此外,当使用std::copy时,它也可以与back_inserter s或其他操纵器一起使用,这在优化中可能无法很好地发挥作用。

但是,例如,您可以选择提供对缓冲区的直接访问,例如std::vector::data

我的问题是可能吗?

解决这个问题的一种方法是,从某种意义上讲,将这种知识导出给班级的用户。只需添加一个间接级别即可。因此,将迭代器返回到内存块中,而不是直接对元素进行迭代器。然后,您将可以具有连续的迭代器。

the standard