[英]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.