2014-02-28 5 views
3

함수 끝에서 함수를 종료하기 전에 마지막 push_back을 수행 할 수 있도록 배열의 모든 요소를 ​​두 배로 변환하기 위해 int에서 캐스팅해야하는 코드가 있습니다. 내가 지금 가지고있는 코드는 다음과 같습니다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 <>'로 불편을 겪고 있다고 생각합니다. [Here] (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'-loop는'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

조심해! 배열로 푸시 백할 수 없습니다. –

+1

그 점을 알려 주셔서 감사합니다. 답변을 업데이트했습니다. – utnapistim

+0

@ BЈови what가 말한 것과 별개로이 답변은 내가 가장하는 것처럼 단순한 것으로 약간 복잡하다고 생각합니다. 그러나 어쨌든 당신을 감사하십시오! –

관련 문제