2

初期化されていないリストを受け入れるコンストラクターが必要な Matrix クラスがあります。コンストラクターは値を取得し、それらを 2D ベクトル (行列) に配置する必要があります。

これは私の 2D ベクトルです。

vector<vector<double>> d_matrix;

これは私のコンストラクタです。

Matrix::Matrix(initializer_list<initializer_list<int>> list)
{
    d_row = list.size();
    d_col = (*list.begin()).size();

    initMatrix();

    for (size_t r = 0; r < d_row; ++r)
    {
        for (size_t c = 0; c < d_col; ++c)
        {
            /* I need to do something here */
            //d_matrix[r][c] = list.begin() + r) + c);
            //cout << (*list.begin()).;
        }
    }
}

これは、初期値から始めるための私の init Matrix 関数です。

void Matrix::initMatrix()
{
    d_matrix.resize(d_col, vector<double>(d_row, 0)); 
}

これが私のコンストラクターの呼び出し方です。

Matrix m({ {1, 2, 3},
           {3, 4, 2} }
         );

リストの次元 (d_row と d_col) を取得することができましたが、リストから値を抽出しようとして立ち往生し、挿入も試してみると、イテレータの開始と終了の両方が行われました。初期化されていないリスト クラスには、2 つの iterator メソッドと 1 つの size メソッドしかないようです。名前空間stdを使用しています。

問題は、初期化されていないリストから値を取得し、それらを d_matrix と呼ぶ 2D ベクトルに格納する方法です。

4

2 に答える 2

6

まず第一に:コンストラクター定義のパラメーターリストの後に初期化リストでメンバーを初期化する必要があります。そうしないと、割り当てを行っています。また、不必要なコピーを避けるために、 std::initializer_listas参照を constに渡す必要があります。

Matrix::Matrix(const std::initializer_list<std::initializer_list<int>>& list)
    : d_row(list.size()), d_col((*list.begin()).size()) {
    // ...
}

第二resizeに、ベクター要素をデフォルトで構築するためにベクターで使用しないでください。代わりに、次のreserveように使用します。

d_matrix.reserve(d_row); // Allocate storage for vector elements.

doubleネストされたベクトルの要素は組み込み型(ctor なし)であるため、要素にメモリを割り当てる必要はありません。

第三に、次のように、コンストラクターでネストされたstd::initializer_list<int>パラメーターの要素タイプを に変更した場合double:

Matrix(const std::initializer_list<std::initializer_list<double>>& list)

次に、コンストラクターで要素をマトリックスに転送するために必要なことは次のとおりです。

for (const auto& l : list) {
    d_matrix.emplace_back(l);
}

実際の例

型を保持intして明示的なキャストを行いたい場合は、代わりに次のようにすることができます。

d_matrix.resize(d_row, std::vector<double>(d_col, 0));
decltype(d_row) r = 0;
for (const auto& l : list) {
    decltype(d_col) c = 0;
    for (const auto d : l) {
        d_matrix[r][c++] = d;
    }
    ++r;
}
于 2013-11-07T17:02:45.987 に答える