5

C スタイルの配列があり、それを QVector に割り当てたいと考えています。std::vector を使用していた場合、以下を使用していましたassign()

int arr[] = { 1, 2, 3, 4, 5 };
std::vector<int> v;
v.assign(arr, arr + sizeof(arr)/sizeof(int));

しかしQVector、同様のassign()メソッドや、範囲を受け入れるコンストラクターが見つかりませんでした。

それを行うための for ループをコーディングしたことがありますが、そのような基本的な関数が存在しないことに驚きました。

4

3 に答える 3

1

からを作成できるfromStdVector()があります。QVectorstd::vector

int arr[] = { 1, 2, 3, 4, 5 };
std::vector<int> v;
v.assign(arr, arr + sizeof(arr) / sizeof(arr[0]));
QVector<int> qvec = QVector<int>::fromStdVector(v);
于 2013-05-15T08:01:40.847 に答える
-2

単純な型 (例: int、char、void* ...など) の場合、::memcpy を利用できます

int arr[] = { 1, 2, 3, 4, 5 };

const int CNT = sizeof( arr ) / sizeof( int );
QVector<int> v( CNT );

// memcpy may be faster than std::copy_n in some compiler
::memcpy( v.data(), arr, CNT * sizeof( int ) );

オブジェクト (例: std::string ) の場合、オブジェクトを arr から v にコピーするループを記述します。

次に、コピーコンストラクターを1つずつ呼び出します

例えば

std::string arr[] = { std::string("a"), std::string("b"), std::string("c") };
const int CNT = sizeof( arr ) / sizeof( std::string );
QVector<std::string> v( CNT );
for( size_t i = 0; i < CNT ; ++i )
    v[i] = arr[i];

arr の各オブジェクトのコピー コンストラクターは 1 つずつ呼び出す必要があるため、より高速な解決策はないと確信しています ( std::copy() を使用しても)。

また、上記のコードは、一部のコンパイラで std::copy と比較すると、コード サイズが小さくなる場合があります。

于 2013-05-15T08:26:37.327 に答える