12

私のチームでこのようなコードを書いている人を見てきました。ベクトルはまったく異なる方法で実装できるため、個人的にはこれは移植可能ではないと思います。私は正しいですか?

vector<int> a;
a.push_back(1);
a.push_back(2);
a.push_back(3);

int* b = &a[0];
std::cout<< *(b +1); // this will print 2
4

2 に答える 2

21

そのコードは正しいです。std::vectorC++03 以降、a に格納されている要素は連続して格納されることが保証されています。

これは、現在の標準 C++ ドラフトN3797(23.3.6.1)の関連部分です。

ベクターは、ランダム アクセス反復子をサポートするシーケンス コンテナーです。さらに、最後に(償却された)一定時間の挿入および消去操作をサポートします。途中での挿入と消去には線形時間がかかります。ストレージ管理は自動的に処理されますが、効率を改善するためのヒントを与えることができます。ベクトルの要素は連続して格納されます。つまり、v が T が bool 以外の型のベクトルである場合、&v[n] == &v[0] + n すべての恒等式に従います0 <= n < v.size()

于 2013-11-01T13:47:12.350 に答える
8

ベクトルがどのような方法で実装されても、一貫性を維持することが標準によって保証されているものがあります。Astd::vectorは常にメモリに連続して格納されるため、ランダム アクセス イテレータを使用できます。

于 2013-11-01T13:48:10.387 に答える