說我有兩種類型的矩陣:reg和稀疏。 我創建了一個抽象的父類「Matrix」,以上兩個繼承自「Matrix」。 我想創建一個抽象迭代器,例如「MatrixIterator」是父級抽象類,而「RegMatrixIterator」,「SparseMatrixIterator」從它繼承。總共6個班級。創建抽象包裝迭代器
RegMatrix持有矢量表示,和稀疏矩陣持有地圖,其對索引和值之間映射。
什麼是實現迭代器的最佳方式?
說我有兩種類型的矩陣:reg和稀疏。 我創建了一個抽象的父類「Matrix」,以上兩個繼承自「Matrix」。 我想創建一個抽象迭代器,例如「MatrixIterator」是父級抽象類,而「RegMatrixIterator」,「SparseMatrixIterator」從它繼承。總共6個班級。創建抽象包裝迭代器
RegMatrix持有矢量表示,和稀疏矩陣持有地圖,其對索引和值之間映射。
什麼是實現迭代器的最佳方式?
的iterator
是一個通用的機制抽象的元素是如何實際存儲的細節。由於通用的面向對象編程(OOP)並不能很好地協同工作,因此迭代器通常不能通過OOP實現。
我不知道爲什麼要使用OOP你Matrix
,即你是否真的想在矩陣使用運行時多態性。如果這真的很重要,那麼您將需要多態性Matrix::begin()
和Matrix::end()
,因此需要多態性Matrix::iterator
。使用這種矩陣代碼如下
#include <Matrix.hpp>
void foo(Matrix const&m)
{
for(a : m) { [...] }
}
但你會付出虛函數調用(虛擬查表)爲每個呼叫的價格的Matrix::iterator
多態方法。如果這不是性能至關重要的話,這種類型的設計是可以的,但對於迭代器來說卻是不尋常的。
然而,我寧願通用編程的方法,由此,兩個矩陣類型可以從一個共同的基中導出,而不是運行時間多態性的目的。然後每種類型都有自己的迭代器類型和它自己的非虛擬begin()
和end()
。使用這種矩陣代碼如下
#include <Matrix.hpp>
template<typename Matrix>
typename std::enable_if<is_Matrix<Matrix>::value>:: // is_Matrix defined in Matrix.hpp
type foo(Matrix const&m)
{
for(x : m) { [...] }
}
相反SFINAE的(std::enable_if
),你可以簡單地static_assert()
正確的矩陣型,雖然 那麼你的功能可能弄混另一個foo(some_arg)
。
非常感謝!它確實有幫助 – 2014-09-01 09:28:19
你爲什麼不不只是用std :: vector的和迭代是什麼? –
2014-09-01 07:16:50
因爲我自己實現了這兩種類型 – 2014-09-01 07:23:42
迭代器在多態性方面表現不佳。看到這裏http://www.artima.com/cppsource/type_erasure.html – 2014-09-01 07:41:56