2

重複の可能性:
代わりに std::vector を使用して、配列/ポインター引数を取る関数を呼び出すことはできますか?

私は最近、次のようなものに出くわしました:

class X {
    public: void foo(float* p, int elements);
};

= float 値の配列を期待するメソッド。

しかし、サンプルコードでは、これが彼らの使用方法でした:

std::vector<float> bar;
bar.push_back(42);
// ...

X x;
x.foo( &bar[0], (int)bar.size() );

std::vectorこれが安全な方法なのか、それともたまたまのほとんどの実装で機能するのか疑問に思っています。(多分これは演算子のオーバーロードの問題ですか?私はまだこのようなものに自信がありません..)

4

3 に答える 3

9

はい、安全です。

n3337 23.3.6.1/1。C++03 標準では、これは 23.2.4/1 です。

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

于 2012-08-27T14:46:48.123 に答える
0

はい、それは許容され、Forever が指摘するように機能します。ただし、ベクトルを削除しないように注意し、配列にダングリング ポインターを残さない限り、安全です。配列とベクトルの間でメモリを共有しているため、そのメモリを管理するのはあなた次第です。

于 2012-08-27T14:49:54.733 に答える
-1

ここから:

そのため、それらの要素は厳密な線形シーケンスに従って順序付けられます

その定義と要素アクセス演算子 ([]) を使用すると、expression&avector[0]は最初の要素のアドレスを取得し、次の要素はその後の連続したシーケンスになります。

于 2012-08-27T14:50:36.153 に答える