1. accumulate 함수

1) 특정 구간에 있는 배열의 원소들을 특정 방식에 맞게 쌓아서 리턴해주는 함수

 - 기본적으로 합계 구하는 데 많이 쓴다)

 

2) numeric 헤더에 있다

 

3) accumulate([배열 시작 주소], [배열 끝 주소], [초기값], [연산 함수])

 - 배열 시작 주소, 배열 끝 주소, 초기값은 반드시 입력해야 한다

 - 연산 함수를 따로 지정하지 않으면 + 연산으로 수행이 되고, 다른 연산자를 지정해줄 수도 있다.(예를 들어 곱셈은 multiplies<int>() 를 넣어주면 된다.)

 4) 사용자 지정 함수를 사용하는 건 조금 복잡하다

 - 예를 들어 3, 2, 5, 10, 2 원소가 있을 때 3 <-> 2 <-> 5 <-> 10 <-> 2 의 문자열 결과를 출력하고 싶다면 배열의 원소들을 저런 방식으로 accumulate 해줄 수 있는 사용자 지정 함수를 사용해야 한다.

 - 작동 방식은 다음과 같다

  (A) "3"

  (B) "3 <-> 2"

  (C) "3 <-> 2 <-> 5"

   ...

  (N) "3 <-> 2 <-> 5 <-> 10 <-> 2"

 - 이때 배열 원소 타입이 int이기 때문에 string으로 바꿔줘야(to_string) 하는 점을 고려해야 한다. 

 - 근데 이럴 경우 리턴 값이 string이 되기 때문에 이 리턴값을 계속 accumulate 해가려면 함수의 인자도 string, int 여야 한다. 그러므로 [초기값]을 "3"으로 설정하고, [배열 시작 주소]를 배열 시작 주소의 다음 주소(두 번째 원소 : int형)로 해줘야 함수 인자인 (string, int) 형식을 맞춰줄 수 있다.

 - 만약 배열 시작 주소를 두 번째 원소의 주소[next(arr.begin())] 으로 안 하고 배열 시작 주소[ arr. begin() ] 으로 해버린다면 "3 <-> 3 <-> 2 <-> 5 <-> 10 <-> 2" 값이 나오게 될 것이다.

 

4) 예시

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <numeric>
#include <functional>

using namespace std;

int main()
{
	vector<int> arr = {3, 2, 5, 10, 2};
	
	//합계
	cout << "SUM : " << accumulate(arr.begin(), arr.end(), 0) << endl;

	//곱셈
	cout << "MULT : " << accumulate(arr.begin(), arr.end(), 1, multiplies<int>()) << endl;
	
	//사용자 지정 함수
	auto myOperation = [](string a, int b){
		return a + " <-> " + to_string(b);
	};
	cout << "My funct : " << accumulate(next(arr.begin()), arr.end(), to_string(arr[0]), myOperation) << endl;
    
	return 0;
}

 

 

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

개발환경 세팅  (1) 2024.01.14
코드가 돌아가는 원리  (1) 2023.12.28
프로그래밍과 C++  (0) 2023.12.27

+ Recent posts