2016-12-05 4 views
0

나는CArray를 기대하는 MFC 함수에 std :: vector를 전달할 수 있습니까?

std::vector<double> vecArr 

가 어떻게이 기능

BOOL AddData (const CArray<double,double>& arrValue) 

에 전달할 수 있나요?


발언이 할 수없는 것을 제안, 그리고 내가 먼저 CArray 객체에 std::vector 개체를 변환 것을 제안했다. 그러나 그것은 시간면에서 매우 비쌉니다. 7 초를 측정하고 7 밀리 초를 측정했습니다.

// Copy vector v1 to v2 (very fast) 
vector<double> v1; 
v1.resize(1000000);   // 1 Mio elements 
vector<double> v2(v1);  // ~7ms 

// Copy vector v1 to CArray a1 (very slow) 
CArray<double, double> a1; 
a1.SetSize(v1.size());  // Reserve 1 Mio elements 
vector<double>::iterator it = v1.begin(); 
while (it != v1.end())  // ~7sec ! :((
    arr.Add(*it++);` ` 

이 솔루션의 성능을 향상시킬 수있는 방법이 있습니까?

+4

간편함 -'AddData'의 매개 변수를'std :: vector '으로 변경하고 MFC 컨테이너 클래스를 사용하여 드롭합니다. – PaulMcKenzie

+2

아니면, 당신은'CArray'를 생성하고 모든 요소를 ​​복사 한 다음'AddData' 함수에 넘길 수 있습니다. –

+0

@PaulMcKenzie 정확하게 이해하지 못합니다. 아쉽게도 AddData() 시그니처를 변경할 수 없습니다. –

답변

1

std::vectorCArray으로 "재 해석"할 수있는 방법이 없습니다. 두 클래스 모두 동일한 개념을 나타내지 만 동일하지는 않습니다. 완전히 다른 두 언어와 같습니다. 당신은 러시아어에서 말하는 것과 똑같은 말을 할 수 있습니다. 그러나 나는 러시아어를 읽을 수 없기 때문에 그것을 이해할 수 없습니다!

  1. 변환CArraystd::vector :

    당신은 기본적으로 세 가지 옵션이 있습니다.

    러시아어에서 영어로 번역 할 때와 마찬가지로 시간이 오래 걸립니다. 다행스럽게도 언어 변환과 달리 사소한 과정입니다. 단순히 원래의 std::vector을 반복하고 각각의 요소를 새로운 CArray으로 복사하면됩니다.

    필요한 요소 수만큼 공간을 미리 할당해야하는 경우이 작업은 O (n) 시간과 공간에서 수행 할 수 있습니다. 그것은 무료는 아니지만 (일반적으로) 너무 비싸지도 않습니다.

  2. 함수의 인터페이스을 변경하여 std::vector 개체를 허용하도록 변경하십시오.

    아마도 이것은 옵션입니다. 표준 라이브러리 컨테이너 클래스를 표준화하고 MFC 컨테이너 클래스에서 멀리 이동해야합니다. 상호 운용성 및 성능을 포함한 여러 가지 이유가 있습니다.

    명백한 단점은 시간이 오래 걸리며 오류가 발생하기 쉬운 잠재적 인 대규모 변경 및 변경 내용을 코드를 변경해야한다는 것입니다. 그러나 코드가 완전히 지원되지 않고 더 이상 개선되지 않는 한 실제로 수행해야하는 매우 유용한 리팩토링입니다. 리팩토링이 완료되면 런타임에 성능 비용이 들지 않아 이상적인 솔루션을 생성합니다.

  3. 함수의 인터페이스를 변경하여 최저 공통 분모 매개 변수를 허용하는 "혼합형"솔루션을 사용하십시오. 특히 C 스타일 배열 (배열의 첫 번째 요소에 대한 포인터 인 하나의 매개 변수와 배열의 길이를 나타내는 두 번째 매개 변수)을 사용할 수 있도록 함수를 변경하십시오.

    std::vector 개체와 CArray 개체 모두 기본 C 스타일 배열 인 것처럼 처리/재 해석 할 수 있으므로 코드 기반 전체에 필요한 침입 성 변경 횟수가 최소화되므로 호환성이 극대화됩니다 . 지역적으로 어느 컨테이너 유형이든 편리하게 사용할 수 있으며, 상호 운용성을 위해 가장 낮은 공통 분모를 통과시킵니다.

    이 솔루션의 단점은 여러 가지이며 처음에는 형식 안전 컨테이너를 사용하는 이유와 동일하므로 2 번 솔루션이 모두 가능하다면 그렇게하는 것이 좋습니다.