2014-09-01 60 views
0

說我有兩種類型的矩陣:reg和稀疏。 我創建了一個抽象的父類「Matrix」,以上兩個繼承自「Matrix」。 我想創建一個抽象迭代器,例如「MatrixIterator」是父級抽象類,而「RegMatrixIterator」,「SparseMatrixIterator」從它繼承。總共6個班級。創建抽象包裝迭代器

RegMatrix持有矢量表示,和稀疏矩陣持有地圖,其對索引和值之間映射。

什麼是實現迭代器的最佳方式?

+0

你爲什麼不不只是用std :: vector的和迭代是什麼? – 2014-09-01 07:16:50

+0

因爲我自己實現了這兩種類型 – 2014-09-01 07:23:42

+1

迭代器在多態性方面表現不佳。看到這裏http://www.artima.com/cppsource/type_erasure.html – 2014-09-01 07:41:56

回答

1

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)

+0

非常感謝!它確實有幫助 – 2014-09-01 09:28:19