我正在實現一個模板化的sparse_vector類。它就像一個矢量,但它只存儲與默認構造值不同的元素。如何實現一個sparse_vector類
因此,sparse_vector會爲所有不是T()的索引存儲懶惰排序的索引 - 值對。
我將我的實現基於數字庫中現有的稀疏向量 - 儘管我也會處理非數字類型T.我看着boost::numeric::ublas::coordinate_vector
和eigen::SparseVector
。
兩個店:
size_t* indices_; // a dynamic array
T* values_; // a dynamic array
int size_;
int capacity_;
他們爲什麼不乾脆用
vector<pair<size_t, T>> data_;
我的主要問題是什麼是兩個系統的優點和缺點,並最終更好?
對的向量管理你的size_和capacity_,並簡化伴隨的迭代器類;它也有一個內存塊而不是兩個,所以它會導致一半的重新分配,並且可能具有更好的參考位置。
另一種解決方案可能搜索更快,因爲緩存行在搜索期間只填充索引數據。如果T是8字節類型,那麼可能還有一些對齊優勢?
在我看來,對的向量是更好的解決方案,但兩個容器都選擇了另一個解決方案。爲什麼?
我想'map' +大小/容量會比任何數組/矢量選項更好。 o.0 – Amber 2010-05-11 06:20:29
首先,在'pair'中有一個未初始化的T會與對的ctors和dtor混淆(並且基本上不可行)。馬上就需要你自己的專業實用程序類(類似boost :: optional)。 –
2010-05-11 06:21:36
@Dav:boost有另一種使用地圖的稀疏矢量類型。對於具有多個條目的向量,在實踐中它會稍微慢一些。不過這是一個很好的解決方案。 @Roger Pate:您存儲的T都已初始化。 – 2010-05-11 06:24:59