我正在開發一組所有派生自抽象向量的向量類。我這樣做是爲了在使用這些向量的軟件中,我們可以在沒有任何代碼中斷的情況下快速切換向量(或至少將故障最小化,但我的目標是完全兼容)。所有的矢量匹配。C++ - 管理基於磁盤的向量中的引用
我的工作在基於磁盤的向量中大多符合匹配STL向量執行。我這樣做是因爲我們需要處理包含各種格式數據的大量內存不足的文件。磁盤矢量通過使用模板專業化/多態性的序列化和反序列化類來處理數據讀/寫到磁盤。數據序列化和反序列化已經過測試,並且工作正常(到目前爲止)。處理數據引用時出現問題。
例如,
給定一個DiskVector dv
,以dv[10]
的調用將得到一個指向磁盤上的一個點,然後尋求在那裏,讀出的字符流。這個流被傳遞給反序列化器,該反序列器將字節流轉換爲適當的數據類型。一旦我有了價值,我就會回報它。
這是我遇到問題的地方。在STL中,它們將它作爲參考返回,所以爲了匹配它們的樣式,我需要返回一個參考。我所做的是將值存儲在具有給定索引的unordered_map中(在本例中爲10)。然後我返回一個對unordered_map中的值的引用。
如果這種情況持續下去,不清洗的話,由於所有的數據只是被加載到內存中,這是不好的,由於數據量的DiskVector的目的丟失。所以我通過在其他呼叫進行時刪除索引來清理此地圖。不幸的是,如果用戶決定長時間存儲此參考文件,然後在DiskVector中將其刪除,則會出現問題。
所以我的問題
- 有沒有辦法,看看是否在一定情況下的任何其他參考文獻都在使用?
- 有沒有更好的方法來解決這個問題,同時仍然保持多態的風格,因爲開始描述的原因?
- 是否有可能構造一個特殊的類作爲參考,但動態處理磁盤IO,所以我可以只返回它呢?
- 有沒有其他想法?
而不是返回引用,你可以返回一個具有'運算符T()'和'運算符=(T const&)'的對象。這意味着你可以主要使用這個對象,就像它是數據的一個實例一樣。你可以用一個偏移量構造這個對象到文件中,所以'operator T()'是從磁盤讀取數據的代理,'operator =(T const&)'是寫數據的代理磁盤。 – cdhowie 2014-12-05 16:16:55
是的,已有先例在[了'矢量'專業化]返回,而不是實際的C包裝對象++參考(http://en.cppreference.com/w/cpp/container/vector_bool/reference)。 –
cdhowie
2014-12-05 16:22:13
太棒了。謝謝。我會讓它工作併發布解決方案的詳細信息。 – 2014-12-05 18:33:27