簡體   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