2014-12-24 52 views
0

我有一個使用std::vectorstd::vector的矩陣類。 我想允許使用matrix[i][j]語法,但不能在接口中分解std :: vector,所以我創建了一個Row類。矩陣示例中的正確性正確性

template <typename T> 
class Row { 
public: 
    explicit Row(std::vector<T>& value): value(value) { 

    } 

    T& operator [] (size_t index) { 
     return value[index]; 
    } 

private: 
    std::vector<T>& value; 
}; 

template <typename T> 
class Matrix { 
public: 
    Matrix(std::size_t n, std::size_t m, const T& value = T()): value(n, std::vector<T>(m, value)) { 

    } 

    // irrelevant functions 

    Row<T> operator [] (size_t index) { 
     return Row(value[index]); 
    } 

private: 
    std::vector<std::vector<T>> value; 
}; 

一切都很好,直到我想與const矩陣工作。如果我有一個const矩陣,我不能創建,因爲我只有const operator []外部向量(所以只有const vector<T>&),如果我將 ctor參數更改爲const vector<T>&我將無法返回T &。

我知道我可以創建一個類ConstRow,它具有完全相同的功能,只是它會得到/返回const refs,但是可以在不創建新類的情況下很好地解決這個問題嗎?

回答

1

我知道我可以創建一個類ConstRow,將有不同之處在於它會得到絕對相同的功能/返回const的裁判,但它可以在不創建一個新類

有很好的解決這個沒有解決方法;這是你唯一的選擇(或者至少是唯一的選擇,沒有比它更值錢的麻煩)。考慮即使像list這樣的標準庫容器,對於const列表和非const列表的迭代器也使用不同的類型。

+0

這聽起來像一個參數:( – RiaD

3

可避免的開銷具有通過使用保持一類:

template <typename T> 
using Row = std::vector<T>; 

並在Matrix定義使用。

template <typename T> 
class Matrix { 
public: 
    Matrix(std::size_t n, std::size_t m, const T& value = T()): value(n, Row<T>(m, value)) { 

    } 

    // irrelevant functions 

    Row<T>& operator [] (size_t index) { 
     return value[index]; 
    } 

    Row<T> const& operator [] (size_t index) const { 
     return value[index]; 
    } 

private: 
    std::vector<Row<T>> value; 
}; 

處理const -ness的自動照顧的正確方法。

+0

@ Jarod42,大眼睛。它現在固定的。 –

0

寫一個數組視圖類。它需要一個類型T並通過T* begin() constT* end() const公開T* iterstors。它有一個T& operator[](size_t)const,可以讓你隨機訪問。而size,front,back,empty而你就是它。

對於ctors,它有指針和指針,指針和大小,C數組,std::array<T,N> snd std::vector<T,A>&non_const_T變體與const&可以添加一些工作。

現在你的[]返回array_view<T>[] const返回array_view<const T>,而鮑勃是你的叔叔。

向它添加邁步也是一個選項。但我不打擾。

+0

它是通過模板'Row'和'ConstRow'的因式分解。 – Jarod42

+0

@ jarod42排序的,除了它是驚人的有用別處。 – Yakk