繁体   English   中英

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

[英]Specialize std::copy for custom iterators

据我所知,可以在 std 命名空间中为函数模板编写模板特化 我编写了一个CircularBuffer<T>类并为这个类实现了一个随机访问迭代器。 std::copy()算法与我的自定义迭代器一起工作,但它不是最佳的。 它遍历范围并一一复制元素。 我可以通过在内部指针上使用std::memcpy()来为简单的可复制类型编写更优化的实现。

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

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

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

完全(last - first)分配

此外,当使用std::copy时,它也与back_inserter或其他操纵器一起使用并不少见,这可能无法很好地进行优化。

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM