2014-02-28 57 views
3

我有一個代碼,在函數的結尾,我需要從int中強制轉換數組,以便在退出該函數之前能夠執行最後的push_back操作,以便將數組的所有元素加倍。我現在所擁有的代碼是:如何在C++中正確地靜態轉換一個向量?

template <class T, size_t dims> class A { 
    typedef typename std::array<int, dims> ArrayInt; 
    typedef typename std::array<double, dims> ArrayDouble; 
    typedef typename std::vector <ArrayDouble> VectorDouble; 

/* ...*/ 

foo() { 
    /* ...*/ 

    ArrayInt myArrayInt; 
    ArrayDouble myArrayDouble; 
    VectorDouble myVectorDouble; 

    /* Initialize myArrayInt 
    Do some other stuff */ 

    for (int i = 0; i < dims; ++i) 
     myArrayDouble[i] = static_cast<double>(myArrayInt[i]); 

    myVectorDouble.push_back(myArrayDouble); 
    } 
} 

它可以正常工作,但我覺得不舒服對線:

for (int i = 0; i < dims; ++i) 
    myArrayDouble[i] = static_cast<double>(myArrayInt[i]); 

是否有這樣做的沒有更好的辦法?

謝謝。

+2

從您的標題,我認爲它是'static_cast <>'這讓你不舒服。 [這裏](http://stackoverflow.com/questions/103512/in-c-why-use-static-castintx-instead-of-intx)對'static_cast <>'很好的解釋。在你的情況下,轉換是由語言支持的有效轉換。沒有其他辦法可以告訴C++將double的向量(或數組)轉換爲int的向量(或數組),而不是通過循環和按值轉換值。這可以。 – ierceg

+2

這些線條的哪一部分你確實感到不舒服?循環,演員,都?對於循環:看看std :: transform。對於演員:這一個不應該傷害,但像boost :: numeric_cast是一個不錯的選擇,因爲它需要舍入/超出範圍/ ... – stijn

+3

你的'for'循環可能被簡化爲'std :: copy(myArrayInt.begin(),myArrayInt.end(),myArrayDouble.begin());',否則它看起來很好。 – Johnsyweb

回答

3

您可以使用算法中的函數。

隨着copy_n

std::copy_n(myArrayInt.begin(), dims, myArrayDouble.begin()); 

copy

std::copy(myArrayInt.begin(), myArrayInt.end(), myArrayDouble.begin()); 
1

這可以用更少的代碼編寫,但它是明確的。

ArrayInt myArrayInt; 
ArrayDouble myArrayDouble; 
VectorDouble myVectorDouble; 

/* Initialize myArrayInt 
Do some other stuff */ 

using std::transform; 
using std::copy; 
using std::begin; 
using std::end; 

// with explicit conversion 
auto to_double = [](const int i) { return double{i}; }; 
transform(begin(myArrayInt), end(myArrayInt), begin(myArrayDouble), 
    to_double); 

// with implicit conversion 
copy(begin(myArrayInt), end(myArrayInt), begin(myArrayDouble)); 
+1

小心!你不能push_back到數組中。 –

+1

感謝您發現。我已經更新了答案。 – utnapistim

+0

除了@BЈовић所說的,我認爲這個答案對於像我假裝那樣簡單的事情來說有點複雜。不過謝謝你! –

相關問題