2011-12-19 9 views
0

は、私は心の内の1つの質問があり、私はのstd ::私は、STLベクトルを持っている場合は、ベクトルポインタ

std::vector<int> *p; 

のように何を書くことができます。しかし、私はどのような状況でそれを使用する場合、私は決めることができないのですか?また、pでポインタされているベクトルのサイズを変更すると、この場合ポインタpに何が起こりますか?

私はここでばかげているかもしれませんが、これらの質問が念頭に置かれており、g ++でstd::vector<int> *pをコンパイルすることができます。

std::vector *p; 

あなたはベクトルへのポインタを宣言されていますと言って

+2

私はあなたがベクトルの要素へのポインタへのベクトルへのポインタを混乱させていると思います。これは、CとC++がネイティブ配列を扱う方法がこの混乱を奨励するため、かなり理解できます。しかし、ベクトルへのポインタは配列へのポインタとは異なり、その要素とは何の関係もありません。 – Omnifarious

答えて

3

。これで、個々の要素ではなく、Vectorオブジェクトのメモリ内容を保持するメモリ位置を割り当てる必要があります。その後、希望に応じて個々の要素を追加、削除、削除、更新することができます。

ベクトルのサイズを変更すると、参照するメモリに何も起きず、Vectorオブジェクトに関連するメモリの内容だけが変更されます。

このような構造の1つの使用法は、ベクトルの動的配列を持つことです。ノードの隣接リストを維持する必要があるとしますが、ランタイムまでに、ノードがいくつになるかは事前には分かりません。

+1

私は、ベクトルの動的配列の代わりに、単にベクトルのベクトルを使うことができると言っています。現代のC++(スマートポインタを考える)では、このようにベクトルを宣言する理由はほとんどありません(実際は、私は考えることができません)。 –

+0

@Shamimだから、ベクトルのサイズを変更する場合、ポインタpは有効です(サイズ変更操作中に内部メモリの場所がベクトルに変更されることもあります)。 – Ruchi

+0

@ルチ:はい、ポインタはまだ有効です。 –

0

実行時に多数の特定のベクターを1つ選択したい場合は、ベクターへのポインタを使用することができます。 e。あなたはそれを動的に選びたいと思う。

「サイズ変更」に関する質問:Are vector pointers affected by resize()?のように、ベクトル自体へのポインタは、ベクトルが存在する限り有効です。しかし、ベクトルの要素へのポインタは変更される可能性があります。例:

std::vector<int> v; 
std::vector<int> *p; 
p = &v; // Does not change 

int *pe; 
pe = &v[0]; // May change