본문 바로가기
프로그래밍/C++

C++ ] accumulate 함수 사용시 주의사항

by eteo 2023. 3. 31.

 

 

 

헤더

#include <numeric>

accumulate 함수를 사용하기 위해선 numeric 헤더를 포함한다.

 

 

 

 

함수 원형

template<class InputIt, class T>
T accumulate(InputIt first, InputIt last, T init);

구간 [first, last)에 속한 요소들의 합을 구한다. init으로 누적값을 초기화하고, 구간 내의 모든 요소들을 차례대로 더해서 누적값을 반환한다.

 

 

❗ 주의할 것은 인자인 first Iterator는 이상이고, last Iterator 미만이다. 때문에 last에는 합을 마지막 요소의 다음 위치를 가르키는 iterator가 온다. vector의 끝까지 연산하는 경우는 vec.end()가 온다.

 

 

 

 

 

 

 

사용 예시

 

벡터 내의 모든 요소의 합을 계산한다.

#include <iostream>
#include <vector>
#include <numeric>

int main() {
    std::vector<int> v = {1, 2, 3, 4, 5};
    int sum = std::accumulate(v.begin(), v.end(), 0);
    std::cout << "sum = " << sum << std::endl;
    return 0;
}
// 출력값 : 15

 

벡터의 2번째 요소부터 4번째 요소까지의 합을 계산한다.

first인자로는 2번째 요소를 가르키는 iterator가 오고 last인자로는 5번째 요소를 가르키는 iterator가 온다.

#include <iostream>
#include <vector>
#include <numeric>

using namespace std;

int main() {
    vector<int> v = {1, 2, 3, 4, 5};
    int sum = accumulate(v.begin()+1, v.begin()+4, 0);
    cout << "sum = " << sum << endl;
    return 0;
}

 

 

 

 

❗ 초기값 선정 시 주의사항

 

accumulate() 함수의 마지막 매개변수인 init 값은 누적값을 초기화하는 값으로 사용될 뿐만 아니라, 반환값 타입을 결정하는 데 중요한 역할을 한다. init 값이 사용되는 방식은 다음과 같습니다.

  • 만약 init이 생략되면, accumulate() 함수는 컨테이너의 첫 번째 요소를 init 값으로 사용한다. 이때, 반환되는 값의 타입은 컨테이너의 요소 타입과 같다.
  • init 값이 지정된 경우, 반환되는 값의 타입은 init 값의 타입과 같다. 이때, 컨테이너의 요소 타입과 init 값의 타입이 다른 경우, 컴파일러는 암묵적 형변환을 수행한다.

 

ex)

init 인자 0 → 반환값 타입 int  

init 인자 0.0 → 반환값 타입 double 타입

init 인자 0LL  반환값 타입 long long 타입

 

 

 

'프로그래밍 > C++' 카테고리의 다른 글

C++ ] JSON 데이터 포맷, rapidjson 라이브러리 사용해 파싱  (0) 2023.05.14
C++ ] stream 상속관계  (0) 2023.05.14
C++ ] 2차원 vector 사용법  (0) 2023.03.31
C++ ] vector 사용법  (0) 2023.03.31
C++ ] STL 과 컨테이너  (0) 2023.03.25