7
vector<int> vec;
boost::scoped_array<int> scpaInts;

scpaInts.reset(new int[10]);

for (int i=0; i<10; i++)
    scpaInts[i] = i*2;

vec.assign(&scpaInts[0], &scpaInts[9]+1);      // => method one
vec.assign(scpaInts.get(), scpaInts.get()+10); // => method two

質問1>私は2つの方法を考え出しました。しかし、それらが正しいのか、それともこれを行うためのより良い方法があるのか​​はわかりません。

質問2>boost:: scoped_arrayから有効な長さを取得できないというのは本当ですか?

ありがとうございました

4

5 に答える 5

3

質問1:どちらの方法でも問題ありません。配列の要素へのポインターは、ランダムアクセスイテレーターの役割を果たすことができます。これも大丈夫です

vec.assign(&scpaInts[0], &scpaInts[10]);

質問2:これは、関数に渡されるCスタイルの配列の長さを取得できないのと同じ理由で当てはまります。

于 2012-10-26T14:46:27.763 に答える
1

方法2を選択します:

vec.assign(scpaInts.get(), scpaInts.get()+10); // => method two

通常の動的配列のように:

int * a = new int[10];
...
vec.assign(a, a+10); // => method two

もちろん、方法1も機能します。たとえば、動的配列の場合と同様です。

vec.assign(&a[0], &a[9]+1); // => method one

ご覧のとおり、方法2は単純に見えるため、優れています。


そして、いいえ、size()スコープ配列にはメソッドがありません。

于 2012-10-26T14:47:23.643 に答える
1

どちらも大丈夫です。しかし、2番目のものは私にとってより明確です。boost::scoped_array単純な配列として機能し、データのサイズを変更できなくなりました。ベクトルにコピーするには、サイズを知っている必要があります。 scoped_arrayイテレータとサイズに関するリンクは次のとおりです

于 2012-10-26T14:45:59.400 に答える
1

9どちらの方法も私には正しいように見えますが、オフセットを1コンポーネントに分割していないため、2番目の方法の方が確実に明確です。他にも2つのオプションがあります。

vec.assign(&scpaInts[0], &scpaInts[0] + 10);

または、必要になる前にベクターを作成しないでください(すべてのオプションの中で最良):

vector<int> vec(scpaInts.get(), scpaInts.get() + 10);
于 2012-10-26T15:14:44.380 に答える
1

質問1:どちらの方法も正しいです。

質問2:正解です。これは、std :: scoped_ptrに似たコンテナであり、渡されたポインタ(を使用して手動で作成されたものoperator new[])がを使用して削除されることを確認しoperator delete []ます。配列のサイズに関する情報は保持されません。

于 2012-10-26T14:50:56.557 に答える