std :: vector ::为QVector分配等价物

时间:2013-05-15 07:56:02

标签: c++ qt

我有一个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循环来编写它,但我很惊讶没有这样的基本功能,是真的如此,还是有相同的功能?

3 个答案:

答案 0 :(得分:5)

您可以使用Qt的qCopy()

int arr[] = { 1, 2, 3, 4, 5 };
QVector<int> v(5);
qCopy(arr, arr+5, v.begin());

或者您当然可以使用std::copy()

int arr[] = { 1, 2, 3, 4, 5 };
QVector<int> v(5);
std::copy_n( &arr, 5, v.begin() );
// or more general:
QVector<int> v2;
std::copy(std::begin(arr), std::end(arr), std::back_inserter(v2));
// without begin/end
std::copy(arr, arr + 5, std::back_inserter(v2));

答案 1 :(得分:1)

fromStdVector(),可让您从QVector创建std::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);

答案 2 :(得分:-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

然后只是逐个调用copy-constructors

e.g。

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中每个对象的复制构造函数,我确信不会有更快的解决方案(即使你使用std :: copy())。

与某些编译器中的std :: copy相比,上面的代码可能会导致更小的代码大小。