0

ベクトルへのポインタのベクトルへのポインタをベクトルに格納しようとしています。(それがあまりにも気の遠くなるようなものではなかったことを願っています)。基本的に、私はベクトルを持っていて、それに複数の行列を格納したいので、3 次元です。要素へのアクセス方法に問題があるようです。3次元はintのベクトルへのポインターであるため、エラーを特に理解していません。intへのアクセス方法を変更する必要はないと思います。

using namespace std;

vector< vector< vector<int>* >* > matrixHolder;

int main() {

    vector< vector<int>* >* a;

    a->push_back(new vector<int>(10, 0));

    matrixHolder.push_back(a);

    matrixHolder[0][0][0] = 5; //Line 34


    return 0;
}

main.cpp:34: エラー: 'int' から 'std::vector < int, std::allocator < int> >*' への変換が無効です</p>

4

2 に答える 2

3

matrixHolder[0]vector<vector<int>*>*は、int のベクトルへのポインターのベクトルへのポインターです。

matrixHolder[0][0]dereferencesであるため、int のベクトルへのポインタのベクトルでmatrixHolder[0]ある typeです。vector<vector<int>*>

matrixHolder[0][0][0]の最初の要素を取得し、matrixHolder[0][0]vector<int>*は int のベクトルへのポインタです。

したがって、これを行うと:

matrixHolder[0][0][0] = 5;

エラーはコンパイラによって記述されたとおりであり、(それが何であるか) から (それが何であるか) への無効int5変換vector<int>*ですmatrixHolder[0][0][0]

この恐ろしい忌まわしさの正しい構文は次のとおりです。

(*(*matrixHolder[0])[0])[0] = 5;

または、これを行うこともできます:

matrixHolder[0][0][0][0][0] = 5;

しかし、それはおそらく何が起こっているのか分かりにくく、5 次元配列のように見えます。

ところで、あなたは間違っています。ポインターを使用する必要はありませんが、ここではそのことを納得させようとはしません。

別の注意事項:

a->push_back(new vector<int>(10, 0));

aは初期化されていないポインターであり、逆参照しただけです。それは未定義の動作です。

于 2013-11-09T02:53:29.157 に答える
0

(より適切に設計されたソリューションの場合...)

vector<vector<T>>行列の保存には使用しないでください。通常の解決策は、単一の配列 (例: vector<T>) であり、単純な算術演算を使用してオフセットを計算します (x + width * y行優先のストレージ用)。

int main() {
    constexpr int w = 10, h = 10;
    vector<vector<int>> matrixHolder(1, vector<int>(w * h, 0));
    int x = 2, y = 3;
    matrixHolder[0][x + w * y] = 5;
}

C++11 の構文で申し訳ありません。

于 2013-11-09T03:01:14.537 に答える