1

配列をベクターにコピーしようとしています。

int A[1000]; //This array is filled by some function
vector<int> vec;

//some position from which I want to write the contents of the array into vector
int x = some_position;

vec.resize(sizeof(A)+x);
vec.insert(vec.begin()+x, A, A+sizeof(A));

問題は、4 つおきの要素が正しくコピーされないことです。残りの要素は正しくコピーされます。すなわち vec[x+3] != A[x+3] for x=0,1,2,3....

4

6 に答える 6

4

まず、 の理解度を確認する必要がありますsizeofA必要なA の項目数ではなく、全体として必要なバイト数を返しますsizeof(A)/sizeof(*A)

int A[1000];
vector<int> vec;

int x = 5;

vec.resize(x + sizeof(A) / sizeof(*A));
vec.insert(vec.begin()+x, A, A + sizeof(A) / sizeof(*A));

「挿入」が必要なものではない可能性があることにも注意してください。ベクトルを配列のように扱い、ベクトルの 1000 要素の長さのセクションを上書きすることが目的の場合は、代わりに std::copy を使用する必要があります。挿入すると配列のサイズがさらに変更されるため、サイズ変更によってベクターが 1005 要素の長さになり、位置 5 から挿入を開始すると、最終的なベクターは 2005 要素の長さになり、A の内容は 5 ~ 1004 になります。

insert代わりに、次の行に置き換えることができます。

std::copy(A, A + sizeof(A) / sizeof(*A), vec.begin() + x);

これにより、位置 5 から始まるベクトルの内容が上書きされ、ベクトルのサイズは 1005 のままになります。

于 2012-09-28T07:07:52.200 に答える
2

配列をベクターにコピーするより良い方法:

vec.resize(1000+some_position);//if needed
std::copy(A,A+1000,vec.begin()+some_position);
于 2012-09-28T07:05:07.240 に答える
1

sizeof(A)と交換sizeof(A) / sizeof(A[0])すれば動作します。

@Sergeyが指摘したようにvec.resize();、この場合は不要で、insert()サイズも変更されますvector

于 2012-09-28T07:11:18.747 に答える
1

の使い方sizeofが間違っています。 オブジェクトまたはタイプのシャロー イメージのバイトsizeof数を返す、非常にプリミティブな演算子です。これは、非常に低レベルのプログラミングを除いて、まったく役に立ちません。C スタイルの配列を処理する必要がある場合、C++11には関数 とがあります。C++ の以前のバージョンでは、それらを自分で書いただけです。(私は通常、基本的に要素数を返す関数も作成しました。)そして、バイト数ではなく要素数で機能します。したがって、最後の 2 行のコードは次のようになります。std::begin()std::end()size()std::vector

vec.resize( x );
vec.insert( vec.end(), std::begin( A ), std::end( A ) );

少なくとも、コメントに基づいて、それがあなたがやろうとしていると思います: 0 に初期化された要素で を作成し、その後std::vector<int>に.xA

于 2012-09-28T07:44:46.237 に答える
1

sizeof() が要素数を与えると信じているようです

例えば

vec.resize(sizeof(A)+x);

しかし、そうではありません。バイト数を示します。

正しいサイズ変更は、次の行に沿ったものでなければなりません

vec.resize(sizeof(A)/sizeof(int)+x);

その次の

vec.insert(vec.begin()+x, A, A+sizeof(A)/sizeof(int));

copy() の方が優れた (よりエレガントな) 方法であるという Sergey の意見には同意します。

于 2012-09-28T07:07:45.047 に答える
0

配列を vector にコピーしないでください。それを完全に回避するには、C++ を使用します。それ以外の

void fill_array(int*, size_t);
int A[1000];
fill_array(A,1000);
std::vector<int> vec;
my_copy(vec,A);

単純に

std::vector<int> vec;
vec.resize(1000);    // or whatever
fill_array(vec.data(),vec.size());  // std::vector::data() is C++11

C++ (これも C++11 より前) では、実際には次のようにします。

template<typename iterator> fill_data(iterator begin, iterator end);
std::vector<int> vec;
vec.resize(n);    // make space (otherwise fill_data cannot fill in anything)
fill_data(vec.begin(), vec.end());

あなたfill_dataは、あらゆるタイプのコンテナに再利用できるほど汎用的です。

于 2012-09-28T09:11:58.783 に答える