2010-07-19 5 views
2

벡터 컨테이너를 사용하여 두 배의 배열을 저장하고 있습니다. 루프를 사용하지 않고 내 벡터의 각 요소에 스칼라를 곱하는 방법이 있습니까? 예를 들어벡터 작업 수행

:

vector<double> Array(10,1); 

내가 작성합니다 0.5에 의해이 배열 곱 초기 값 1 10 복식의 배열 초기화됩니다 다른 방법은

for(unsigned int i=0; i<Array.size(); i++) 
    Array[i] = 0.5*Array[i]; 

이 있습니까? 나는 그래서를 '*'연산자 과부하 된 valarray 사용했다 :

 Array = 0.5 * Array; 

가 유효을하지만 벡터 컨테이너 배열을 조작하기위한 더 표준 접근 방식 보인다 차라리 된 valarray 사용하지 것입니다.

감사합니다.

답변

10

이 작업을 수행 할 수 있습니다 :

std::transform(Array.begin(), Array.end(), Array.begin(), 
       std::bind2nd(std::multiplies<double>(), 0.5)); 

을 대응 요소의 합을 얻는 데 :

std::transform(Array.begin(), Array.end(), Array.begin(), 
       static_cast<double (*)(double)>(std::sqrt)); 

:

double sum = std::accumulate(Array.begin(), Array.end(), 0.0); 

그리고 각 요소를 'sqrt를 받고 보내고에 응답

캐스팅은 올바른 오버로드를 선택하는 것입니다.

+0

감사합니다. 벡터의 요소 합계를 구하는 함수가 있다고 가정합니다. – Wawel100

+1

@ Wawel100 : 예, 추가했습니다.문제가 해결 된 답을 찾은 경우 문제의 답을 클릭하십시오. – GManNickG

+0

감사합니다. 단지 하나의 마지막 질문 : 어떻게 각 요소의 sqrt 루트를 얻기 위해 transform을 사용할 것인가? – Wawel100

0

나는 알고 있지 않습니다.

이 있으면이 루프가 캡슐화됩니다. 그래서 나는 성능이 변할 것이라고 생각하지 않는다.

1

당신은 표준을 사용할 수 있습니다 :: 변환 :

std::transform(Array.begin(), Array.end(), Array.begin(), std::bind1st(std::multiplies<double>(), 0.5))); 
+0

루프가 stl에 숨겨져 있지 않습니까? – sum1stolemyname

+2

물론. valarray는 어떻게 생각하십니까? –

1

STL과 벡터 자체가 한 번의 작업으로 elementwise 스케일링을 허용하지 않습니다.

크기 조정 요소를 적용하는 데코레이터로 벡터를 래핑 할 수 있습니다. 새로운 요소의 적용은 벡터의 크기에 관계없이 O (1)이됩니다. 단점은 복잡성이 증가하고 요소 당 액세스가 다소 증가하기 때문에 무료가 아닙니다.

0

보다 적합한 선택이므로 std::valarray을 사용하는 것이 좋습니다.

표준 라이브러리가 다양한 컨테이너를 제공하는 데는 이유가 있습니다. 개발자가 "코스 용 말"을 사용할 수 있습니다.

std::vector은 가장 간단한 컨테이너이므로 많은 경우에있어 최상의 선택입니다. 그러나 특정 경우에는 다른 컨테이너 유형의 추가 된 기능으로 인해 해당 유형이 더 나은 선택이 될 수 있습니다. 이러한 경우 중 하나 일 수 있습니다. 배열 구성원의 숫자 조작은 std::valarray에 의해 더 잘 처리됩니다.

+1

그는 질문에서 그가 아니라고 말했습니다. :) – GManNickG

+0

나는 논평에서 유효한 비판을 해결하기위한 답을 확장했다. –

관련 문제