Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | |
7 | 8 | 9 | 10 | 11 | 12 | 13 |
14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 | 22 | 23 | 24 | 25 | 26 | 27 |
28 | 29 | 30 |
Tags
- yocto
- esp32
- nucleo
- Linux
- BeagleBone
- Debug
- Raspberry
- vscode
- AArch64
- Arduino
- 라즈베리파이
- atmel
- raspberrypi
- AVR
- Visual Studio
- avr-gcc
- platformio
- 아두이노
- GPIO
- STM32
- USART
- bare metal
- Debugging
- Visual Studio Code
- C++
- QEMU
- UART
- 리눅스
- buildroot
- 디버깅
Archives
- Today
- Total
임베디드를 좋아하는 조금 특이한 개발자?
accumulate() 함수의 overflow 문제 해결 방법 본문
알고리즘 문제를 풀 때, 많은 사람들이 accumulate()함수를 자주 사용할 것으로 생각합니다.
하지만, 해당 함수를 사용할 때 overflow에 대한 문제가 발생하여 for문으로 직접 합을 구하는 경우도 있을 것입니다.
accumulate()함수의 선언을 확인해보면 문제를 해결할 수 있습니다.
template <class _InputIterator, class _Tp>
_Tp accumulate(_InputIterator __first, _InputIterator __last, _Tp __init);
[실제 accumlate() 함수의 선언은 이렇지 않습니다. 보기 편하도록 필요 없는 부분은 제거 하였습니다.]
여기서 중요하게 보아야 하는 것은 _Tp의 타입이 세번째 인수에 의해 결정 된다는 것입니다.
그러므로, 세번째 인수의 타입을 기존 타입보다 더 넓은 범위를 표현 할 수 있는 타입으로 한다면 overflow문제를 해결 될 것입니다.
예시)
int main() {
vector<int> arr{numeric_limits<int>::max(),2};
//overflow 발생
long result1 = accumulate(arr.begin(), arr.end(), (int)0);
//overflow가 발생하지 않음
long result2 = accumulate(arr.begin(), arr.end(), (long)0);
cout << "result1 : " << result1 << endl; // 출력 결과 : -2147483647
cout << "result2 : " << result2 << endl; // 출력 결과 : 2147483649
return 0;
}
'C++' 카테고리의 다른 글
rel_ops를 통한 클래스 비교연산자 자동 구현 (0) | 2022.08.28 |
---|