2

C++ の初心者である私は、自分のMatrixクラスでスポット内の値への参照を返す関数を作成するように依頼されました(i,j)

割り当ての一部として、クラスはマトリックスを表すarrayofを保持します。std::list

list <value_type> * m_val;

これはあまり意味がありませんが、まあ、それが課題です。これで作業を開始するように言われました:

template <class E>
inline E& Matrix<E>::operator() (unsigned i, unsigned j) {

}

これは私が試したものです:

template <class E>
inline E& Matrix<E>::operator() (unsigned i, unsigned j) {
    list<value_type> row = m_val[i];    // Get the row
    typename list< E >::iterator it = row.begin();  // Iterator at beginning of row
    for (int x = 0; x < j; ++x) {
        ++it; // For each column, I increase the iterator until I reach the desired spot
    }


    return *it;   // I'm confused here. I got my iterator in the right spot, but I am not sure how to return a reference to its value.
}

しかし、私が知る限り、これは参照ではなく値を返します。私が達成したいことは本質的に

myMatrix(2,3) = 50;   // Now the value at 2,3 is 50.
4

1 に答える 1

1

list <value_type> * m_val;

これはよく見えません。すでに標準コンテナーを使用している場合は、またはを使用してみませんstd::vector < list<value_type >std::array < list<value_type> >?

それとは別に:

template <class E>
inline E& Matrix<E>::operator() (unsigned i, unsigned j) {
    // less error-prone with bounds-checking, as Remy Lebeau stated in a comment
    if(i >= size_of_m_val_array)
    {
        throw std::out_of_range("first index out of range");
    }

    //list<value_type> row = m_val[i];    // this would copy the list
    list<value_type>& row = m_val[i];

    typename list<value_type>::iterator it = row.begin();

    // less error-prone with bounds-checking, as Remy Lebeau stated in a comment
    if(j >= row.size())
    {
        throw std::out_of_range("second index out of range");
    }

    std::advance(it, j);

    return *it;   // correct :) `*it` returns a `value_type&`
}

ただし、境界チェックは必須ではありません。チェックしない場合は、必ず文書化してください (そして指摘してください!)。

Eorをvalue_type一貫して使用したいと思います。

C++11 ワンライナー:

template < class E >
inline E& Matrix<E>::operator() (unsigned i, unsigned j)
{
    return std::next( m_val[i].begin(), j );
}
于 2013-05-14T00:55:14.147 に答える