1

newで割り当てたい大きな2Dベクトルを使用しようとしています(大きいため)。

私が言うなら:

vector< vector<int> > bob;
bob = vector< vector<int> >(16, vector<int>(1<<12,0));
bob[5][5] = 777;

できます。しかし、私が言うなら:

std::vector< std::vector<int> > *mary;
mary = new vector< vector<int> >(16, vector<int>(1<<12, 0));
mary[5][5] = 777;

それは機能せず、エラーが発生します:

エラー1エラーC2679:バイナリ'=':タイプ'int'の右側のオペランドをとる演算子が見つかりません(または受け入れ可能な変換がありません)c:\ Users \ jsparger \ Documents \ My Dropbox \ ARI \ VME_0.01 \ VME_0.01 \ V965.cpp 11 VME_0.01

明らかに、私はC++を初めて使用します。この操作を実行するために使用する必要のある構文を誰かが説明してもらえますか。maryはポインタなので、なぜこれが機能しないのかはわかりますが、* mary [5] [5] =「新しい」ために許可されていないものは何ですか?

助けてくれてありがとう。このベクトルは、私の小さなc ++の頭脳が理解するのに十分簡単に​​思えるので、今のところ使用しますが、このような大きなベクトルが悪い考えであるかどうかなど、遠慮なく知らせてください。

本当にありがとう。

編集:「新品のため許可されていません」と誤解しています。それは明らかに機能し、そうでないのはあまり意味がないので、どこでそれを誤解したのかわかりません。ありがとう。

4

3 に答える 3

6

maryがポインタの場合、添え字演算子を適用する前に間接参照する必要があります。

(*mary)[5][5] = 777;

下付き文字は間接参照よりも優先順位が高いため、括弧が必要です。

于 2010-07-15T15:09:27.250 に答える
6

とにかく、ベクトルはその要素をヒープに格納します。ベクトルオブジェクト自体は非常に小さいため(通常、32ビットマシンでは12バイト)、ヒープにベクトルオブジェクト自体を割り当てる意味はありません。

于 2010-07-15T15:09:31.713 に答える
2

プレーンCでは、配列とポインターは類似しています(同じではありません!)。これは混乱を招きます。プレーンCで、次の宣言がある場合:

int array1[100];
int *array2 = (int *)malloc(100*sizeof(int));

array1とarray2はまったく同じように使用できます。

ただし、これをCで書く場合:

int (*array3)[100];

これはまったく違うものです。Array3は、配列の要素へのポインターではなく、配列へのポインターになりました。要素にアクセスする場合は、次のように記述する必要があります。

(*array3)[5] = 123;

C ++では、実際に同様のことを行っています。2番目の「mary」はベクトルへのポインターであり、ベクトル内の要素へのポインターではありません。したがって、次のように記述する必要があります。

(*mary)[5][5] = 777;
于 2010-07-15T15:13:43.157 に答える