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

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));
于 2013-05-15T08:13:19.717 回答
1

fromStdVector(),它允许您QVector从 an创建一个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);
于 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

然后一一调用复制构造函数

例如

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 相比,上述代码可能会导致更小的代码大小。

于 2013-05-15T08:26:37.327 回答