c++ - 为自定义迭代器特化 std::copy

标签 c++ iterator template-specialization

据我了解可以write template specializations对于 std 命名空间中的函数模板。我写了一个CircularBuffer<T>类并为这个类实现了一个随机访问迭代器。因为是 std::copy()算法适用于我的自定义迭代器,但它不是最优的。它遍历范围并一个一个地复制元素。我可以使用 std::memcpy() 为平凡可复制的类型编写更优化的实现。关于内部指针。

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

最佳答案

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

使用您的类的用户应该已经知道std::copy 是什么,它是如何工作的,以及内在的性能影响。因此,提供特化可能会使事情变得更糟。 std::copy 保证进行了 N 次赋值;根据 the standard :

Exactly (last - first) assignments

此外,当使用 std::copy 时,它也与 back_inserter 或其他操纵器一起使用,这很可能与优化。

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

我的问题是这甚至可能吗?

您似乎拥有的解决此问题的一种方法是将此知识(在某种意义上)输出给您类(class)的用户。只需添加一个额外的间接级别。因此,不是直接对元素使用迭代器,而是将迭代器返回到内存块。然后您将能够拥有连续的迭代器。

https://en.cppreference.com/w/cpp/named_req/ContiguousIterator

关于c++ - 为自定义迭代器特化 std::copy,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53319423/

相关文章:

c++ - 如何使用模板模板参数专门化模板类的成员

c++ - 整数参数特殊值的模板特化

c++ - RAII 的有用性无一异常(exception)

c++ - 带有接受 C++ 集参数的类的自定义 key_comp

c++ - std::invoke_result_t 编译时语法错误

php - RecursiveIteratorIterator 中 next() 和 nextElement() 的区别

c++ - 交换时增量迭代器 std::next

c++ - 在运行时将参数传递给std::bind到调度队列

c++ - 从配置为生成 DLL 的 visual studio 项目创建 lib 文件

c++ - 具有不同签名的类方法特化