2015-09-13 20 views
0

我試圖找到如下問題的解決方案:提供了一個整數矩陣對某些元素的迭代器

假設我們已經實現了一個抽象數據類型「整數矩陣」 (假設整數是存儲在行中)。我們需要定義一個迭代器迭代器遍歷矩陣的列,並且僅遍歷矩陣的元素。

執行的folling代碼:

Matrix M; 
... 
Matrix::iterator it; 
for(it = M.begin(); it != M.end();++it) 
cout << *it 

在基質上:

5 4 3 
2 1 2 
9 0 2 
8 9 1 

應產生2 8 4 0 2 2

我面臨幾個問題做。 首先,我想避免向class iterator提供有關正在迭代的矩陣的大量信息。提供矩陣的行數和列數是不可避免的嗎? 二,解決方案在很大程度上取決於基體的內部表示,所以我會說我應該實現一個基本的迭代器遍歷逐行...

你認爲是解決這一問題的最佳解決方案? 我只需要關於矩陣和迭代器的表示以及函數開始,結束,運算符*,運算符++和運算符==

回答

0

的建議,而不用猜測您未指定哪些操作需要特別有效,它看起來是一個平坦的線性存儲元素將是最好的。通過調用它的Matrix :: iterator(並使用begin()和end()),你已經暗示這是用於這個Matrix類的普通迭代器(不是一些奇怪的額外迭代器)。所以在矩陣中值得一些額外的內容來保持迭代器的輕量級。你可以使迭代器的數據內容僅僅是一個指針,所以在一個優化的編譯中,迭代器本身只是一個指針。它不需要知道行數或列數或限制。要做到這一點,你需要在矩陣數據的極限處分配和初始化一個警衛位置,它必須保存一個偶數,end()必須是一個指向它的指針(包裝在迭代器類中)。然後begin()可以簡單地找到第一個偶數,迭代器的++可以簡單地找到下一個偶數。

爲了支持我們假設必須存在的其他操作(但您沒有問過),Matrix本身必須知道列數。對於end()和其他操作,Matrix必須知道總大小(表示爲行數或元素數或限制地址是否可以輕鬆轉換爲限制地址)。但是額外的信息最好保存在矩陣中,而不是複製到迭代器中。

相關問題