2017-12-21 2 views

답변

2

valarray 개체의 크기가 컴파일 타임에 알려지지 않았기 때문에 동적 메모리를 사용하지 않고 valarray에서 배열을 만들 수 없습니다.

std::valarray<int> test{10, 20}; 
int arr[test.size()]; // Not standard C++. Some compilers support this 
         // as an extension. 

// This is how you can get a dynamic array from a valarray. 
int* arr = new int[test.size()]; 
std::copy(begin(test), end(test), arr); 

대신 응용 프로그램 코드에서 동적으로 할당 된 메모리를 관리하기 위해 노력하는 std::vector<int>를 사용하는 것이 더 좋을 것이다.

std::vector<int> arr(begin(test), end(test)); 
+0

'std :: copy'의 복잡성과 루프의 복잡성이 같지 않습니까? –

+0

@IbrahimYousaf, 네, 그렇습니다. –

+2

@IbrahimYousaf : 실제로는 더 빠를 수도 있습니다. http://en.cppreference.com/w/cpp/algorithm/copy를 참조하십시오 : * "실제로, std :: copy의 구현은 다중 할당을 피하고 std :: memmove와 같은 대량 복사 함수를 사용합니다. 형식은 TriviallyCopyable입니다. "* –

2

우리는 어떻게 다른 방법으로 주위를 이동할 수 있습니다? 당신이 컴파일시 valarray의 크기를 알고있는 경우

, 당신은 int[3]을 준비하고, 예를 들어 각각의 요소에 값을 복사 할 수 있습니다 std::copy 사용 : 크기는 컴파일 타임에 알려져 있지 않은 경우 대신 std::vector를 사용

#include <valarray> 
#include <iostream> 

int main() 
{ 
    std::valarray<int> va { 1, 2, 3 }; 
    int arr[] = { va[0], va[1], va[2] }; 

    std::cout << arr[0] << '\n'; 
    std::cout << arr[1] << '\n'; 
    std::cout << arr[2] << '\n'; 
} 

:

#include <valarray> 
#include <algorithm> 
#include <iostream> 

int main() 
{ 
    std::valarray<int> va { 1, 2, 3 }; 
    int arr[3] = { 0 }; 
    std::copy(begin(va), end(va), arr); 

    std::cout << arr[0] << '\n'; 
    std::cout << arr[1] << '\n'; 
    std::cout << arr[2] << '\n'; 
} 

당신은 심지어 바로 올바른 값으로 배열을 초기화 할 수

#include <valarray> 
#include <vector> 
#include <iostream> 

int main() 
{ 
    std::valarray<int> va { 1, 2, 3 }; 
    std::vector<int> v(begin(va), end(va)); 

    for (auto const& element : v) 
    { 
     std::cout << element << '\n'; 
    } 
} 
+0

배열 크기가 크고'std :: copy'의 복잡성이 선형 인 경우. 최적화 된 방법은 무엇입니까? –

+1

@IbrahimYousaf : 알아 내려면 측정해야합니다. 아마 당신은 대안적인 방법을 찾아야한다 : (1)'std :: valarray'를'std :: vector'를 위해 완전히 없애고, (2) 나머지 코드를 반복자 쌍을 사용하도록 리팩토링하고, 적어도 C++을 사용할 수 있다면'std :: valarray'의'begin'과'end' 전문화를 계속 사용할 수 있습니다. 그것은 valarray의 내용으로 무엇을 할 것인가에 달려 있습니다 ... –

+1

@IbrahimYousaf 배열로부터 'valarray'를 만드는 것은 또한 선형 시간입니다. –

관련 문제