1. ホーム
  2. c++

ベクトルポインタをデリファレンスして要素にアクセスする

2023-10-12 07:38:55

質問

C++でベクトルへのポインタを持っている場合。

vector<int>* vecPtr;

そして、ベクトルの要素にアクセスしたいのですが、その場合、ベクトルの参照を解除することで可能です。

int a = (*vecPtr)[i];

しかし、このデリファレンスは実際にスタック上にvectorのコピーを作成するのでしょうか? 例えば、vectorが10000intを格納しているとすると、vecPtrをデリファレンスすることによって10000intがコピーされるのでしょうか?

ありがとうございます。

どのように解決するのですか?

10000 int はコピーされません。デリファレンスは非常に安価です。

明確にするために、次のように書き換えることができます。

int a = (*vecPtr)[i];

として

vector<int>& vecRef = *vecPtr; // vector is not copied here
int a = vecRef[i];

に格納されているデータが全部消えてしまうのが心配な場合は、このように vector に格納されているデータ全体がスタック上に配置されることを恐れて vector<int>* の代わりに vector<int> を使用すると、これを避けることができます。 実際には、スタックに固定量のメモリ (実装に依存する約 16-20 バイト) が使われるだけであり、これは vector . また vector はそれ自身がメモリを確保し、ヒープ上に要素を格納します。