我正在实现一个模板化的 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 字节类型,也可能有一些对齐优势?
在我看来,对向量是更好的解决方案,但两个容器都选择了另一个解决方案。为什么?