2012-02-25 5 views
5

을 사용하면 복소수 배열을 반복하고 합계 할 수 있습니다. 나는 이것을 할 수있는 두 가지 방법이있다. 더 나은 이유C++ 배열 포인터 [] 또는 ++

A)

double sum (double * series, int size) { 
    double sum = 0.0; 
    for (int i = 0; i < size; i++) { 
     sum += *series++; 
    } 
    return sum; 
} 

B)

double sum (double * series, int size) { 
    double sum = 0.0; 
    for (int i = 0; i < size; i++) { 
     sum += series[i]; 
    } 
    return sum; 
} 

/I는 다른 통해 하나를 사용해야합니다.

+0

포인터가 어떻게 작동하는지 모르는 경우 이해가 쉽고 짧기 때문에 B)를 좋아합니다. std :: accumulate와 함께 벡터를 사용할 수 있습니다. – chris

+0

스타일 A는 당신이 성취하고있는 것이 분명하지 않습니다. 개인적으로, 저는 항상 C# 배경에서 오는 스타일 B를 선택합니다. –

+0

@Richard J. Ross III,'* series'는 어떤 시리즈가 가리키고있는 데이터를 평가합니다. 루프는 계열을 증분하여 매번 배열의 다음 요소를 가리 킵니다. – chris

답변

6

이것은 읽기 쉽기 때문에 성능에 영향을 미치지 않습니다. 나는 B가 가장 읽기 쉽고, 따라서 바람직하다고 생각합니다.

double sum (double* begin, double* end) { 
    double sum = 0.; 
    for (double* it = begin; it != end; ++it) { 
     sum += *it; 
    } 
    return sum; 
} 

이 많은 경우에 관용적 C++과 더 쉽게 일반화 :

또한 범위를 기반으로 세 번째 변형을합니다 (beginend 매개 변수를주의) 제안 할 수있다. 즉, 이 항상이라고 말하는 것이 아니라 가독성과 유지 관리 가능성에 대한 질문에서 또 다른 변형입니다.

+0

그래, 기본적으로 std :: accumulate가 벡터로하는 일입니다. – chris

+0

''시작하기 '''''끝내기를 바랍니다. 'begin'' ==''end''이 어떻게됩니까? –

+1

@SimonWright : 그러면 루프에 들어가서 즉시 0을 반환합니다. 루프 상태는 몸에 들어가기 전에 확인됩니다 :) –

4

본질적으로 다른 것보다 우수합니다. 당신은 당신의 코드 의도를 가장 분명하게 만드는 것을 선택해야한다. 최신 컴파일러의 경우 동일한 기계 코드로 최적화해야합니다.


단, 원시 배열 원시 포인터 주위에 전달하는 C++ 나쁜 스타일로 간주됩니다. std::vector과 같은 컨테이너 클래스 사용을 고려하십시오.

1

성능면에서 현대적인 최적화 컴파일을 사용할 때 차이가 없어야합니다.

간접적 인 자동 증가 주소 지정은 처리하는 데 필요한주기가 더 적었고 index + offset을 autoincrement로 변환 할 수있는 최적화 기가 없었기 때문에 1978 년에 처음으로 PDP-11에서 다소 빠릅니다.

P. series이 값으로 전달되기 때문에 series -= size; 설정은 아무 효과가 없습니다. 내가 것

+0

시리즈 - = 크기; 시리즈를 첫 번째 항목으로 다시 설정합니다. –

+1

@PatrickLorio 예, 값으로 전달되는 포인터의 * copy *에서 수행합니다. 할당 후에'series'에 접근하지 않고 다음 줄로 돌아오고 있기 때문에,이 할당은 효과가 없습니다. 예를 들어, 합계를 찾는 것 외에도 가장 큰 또는 가장 작은 요소를 찾으려면 포인터 *를 다시 사용하는 것이 좋습니다. – dasblinkenlight

+3

@PatrickLorio 상관 없어요. 전달 된 실제 포인터는 값에 의해 전달되기 때문에'- = '크기를 사용하면 처음에 전달 된 변수에 영향을 미치지 않습니다. –

5

뿐만 아니라 스타일 B를 선택,하지만 당신은 명시 적 루프를 통해 표준 알고리즘을 선호한다 :

#include <numeric> 

double sum(const double* const series, const int size) { 
    return std::accumulate(series, series + size, 0.0); 
} 
0

그냥 합 원하지 않는다면 (배열을 반복하는 C++ (11)의 방법 그들과) 당신의 필요에 맞지 않는 축적은 다음과 같습니다

double sum (const vector<double>& series) { 
    double sum = 0.0; 
    for_each (begin(series), end(series), [&](double v) { 
     sum += v; 
    }); 
    return sum; 
} 
: 당신은 벡터 또는 목록을 사용하는 경우가 거의 동일한 코드를 얻을 거라고

double sum (const double * series, int size) { 
    double sum = 0.0; 
    for_each (series, series + size, [&](double v) { 
     sum += v; 
    }); 
    return sum; 
}