我有一个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循环来编写它,但我很惊讶没有这样的基本功能,是真的如此,还是有相同的功能?
答案 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相比,上面的代码可能会导致更小的代码大小。