2013-08-29 52 views
2

我有一個矩陣類,其存儲在一個std::vector其數據:矢量都指向相同的存儲器

std::vector<double> mData(mRows*mCols); 

類有一個方法來提取從該矩陣中的列中:

std::vector<double> matrix::getCol(const int &n) const 
{ 
    std::vector<double> Col(mRows); 

    for(int ii = 0; ii < mRows; ii++) 
    { 
     Col[ii] = mData[n*mRows + ii]; 
    } 

    return Col; 
} 

我想有此方法把一索引返還即是mData一個子集的載體。是這樣的可能嗎?

std::vector<double>& matrix::getCol(const int &n) 
{ 
    std::vector<double> Col(mRows); 
    &Col[0] = &mData[n*mRows]; 

    return Col; 
} 

,我很感興趣,這樣做的原因是,我想在分配使用這種方法:

matrix A(rows,cols); 
std::vector<double> newCol(rows); 
A.getCol(0) = newCol; 

回答

2

另一種替代方法是編寫一個array_ref類,它包含一個指向數據和大小的指針,但不是擁有的數據。這將允許修改元素,但不允許插入或刪除。然後你可以將它構造成指向規則數組,向量或者子集的任何一個。對於具有string_ref類的字符串,這實際上是相當普遍的做法,可能涉及std::stringchar*char[N]的內容。這將非常簡單,並且幾乎不需要對現有的matrix類進行更改。

//untested sample 
template<class T> 
struct array_ref { 
    typedef T value_type; 
    typedef T& reference; 
    typedef T* pointer; 
    typedef ptrdiff_t difference_type; 
    typedef size_t size_type; 
    typedef T* iterator; 
    typedef const T* const_iterator; 

    array_ref() : data(nullptr), len(0) {} 
    array_ref(T* data_, size_t len_) : ptr(data_), len(len_) {} 
    T& at(size_t index) {assert_range(index); return ptr[index];} 
    const T& at(size_t index) const {assert_range(index); return ptr[index];} 
    T* begin() {return ptr;} 
    const T* begin() const {return ptr;} 
    T* end() {return ptr+len;} 
    const T* end() const {return ptr+len;} 
    T* data() {return ptr;} 
    const T* data() const {return ptr;} 
    T& operator[](size_t index) {return ptr[index];} 
    const T& operator[](size_t index) const {return ptr[index];} 
    size_t size() const {return len;} 
private: 
    void assert_range(size_t index) const 
    {if (index>=len) throw std::out_of_range("out of range");} 
    T* ptr; 
    size_t len; 
}; 
2

一種方法是矩陣的數據存儲到一個std::vector<std::vector<double> >。然後,matrix::getCol()的實現很簡單。

class matrix { 
public: 
    matrix(int row, int col) 
     : mData(col, std::vector<double>(row)) 
    { 
    } 
    std::vector<double>& getCol(int n) 
    { 
     return mData[n]; 
    } 
private: 
    std::vector<std::vector<double> > mData; 
}; 

matrix A(rows, cols); 
std::vector<double> newCol(rows); 
A.getCol(0) = newCol; // works fine 

另一種方法是定義matrix::setCol()來代替。