2013-05-15 96 views
5

我有一個C風格的數組,我想將它分配給QVector。如果我使用的std ::向量,我會用assign()std :: vector :: assign QVector的等價物

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

QVector我找不到類似的assign()方法,或任何範圍內接受的構造函數。

我已經編寫了一個for循環來做到這一點,但我很驚訝,沒有這樣一個基本的功能,是真的,還是有相當的?

+0

正如一個側面說明,在你的例子中,我甚至不會使用'assign',而是'vector'。 –

回答

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)); 
+0

@pmr很好,很滑。 – cmannett85

+2

這並不具有相同的效果。它推動了後面的新元素。它只適用於'QVector'是空的開始。 – juanchopanza

+0

@juanchopanza它與OP正在複製的'vector'-based代碼具有相同的效果,儘管你原則上是正確的。 – cmannett85

1

fromStdVector(),它允許您創建從一個std::vectorQVector

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); 
+0

我不認爲這是OP想要的。他希望將C風格的數組分配給'QVector'。他不想爲'QVector'分配一個'vector'。 – pmr

+0

唯一的問題是我們創建並銷燬臨時對象(即性能)。 – sashoalm

+0

@pmr雖然將數組轉換爲一個'std :: vector'後面可能跟着從'std :: vector'到'QVector'的轉換,但我同意這可能不如一個簡單的'std :: copy' (特別是關於表現)。但這樣你可以只用一個單獨的初始化行來完成,而不是初始化,然後複製(當然,只有當這個完整的'assign'瘋了才能正確初始化臨時'std :: vector')。 –

-2

簡單類型(如int,焦炭,無效* ...等),你可以利用:: 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)寫一個循環來複制這些對象,從編曲到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 ::複製())。

而上面的代碼在某些編譯器中與std :: copy相比可能會導致較小的代碼大小。

+0

儘管memcpy對於std :: strings的向量不起作用。此代碼可能會導致潛在的錯誤。 – sashoalm

+3

這是一個可憎的事。 – pmr

+1

*永遠不要*在C++容器類中使用類似memset的東西。不要。 –

相關問題