2026년 상식닷컴 선정 식당 & 카페 리스트
최근에 오픈한 호텔을 찾는다면 살펴보세요

C++에서 std::transform의 사용법은?

_____
Q1: std::transform란 무엇인가요?
A1: std::transform는 C++ 표준 라이브러리 알고리즘 중 하나로, 입력 범위의 각 요소에 지정한 함수(또는 함수 객체)를 적용하여 결과를 출력 범위에 저장합니다. 주로 컨테이너나 배열의 요소를 변환할 때 사용됩니다.

---

Q2: std::transform의 기본 함수 원형은 어떻게 되나요?
A2:
```cpp
// 단일 입력 범위 버전
template
OutputIt transform(InputIt first, InputIt last, OutputIt d_first, UnaryOperation unary_op);

// 두 입력 범위 버전
template
OutputIt transform(InputIt1 first1, InputIt1 last1, InputIt2 first2, OutputIt d_first, BinaryOperation binary_op);
```

---

Q3: std::transform의 파라미터 의미는 무엇인가요?
A3:
- `first`, `last` : 변환할 첫 번째 입력 범위의 시작과 끝 반복자
- `d_first` : 결과를 저장할 출력 범위의 시작 반복자
- `unary_op` : 각 요소에 적용할 단항 함수 (요소 하나를 인자로 받음)
- `first1`, `last1`, `first2` : 두 입력 범위의 시작과 끝 (첫 번째 범위는 [first1, last1))
- `binary_op` : 두 요소를 인자로 받아 결과를 반환하는 이항 함수

---

Q4: 단일 입력 범위를 변환하는 예시는?
A4:
```cpp
include
include
include

int main() {
std::vector v = {1, 2, 3, 4};
std::vector result(v.size());

std::transform(v.begin(), v.end(), result.begin(), [](int x) { return x * x; });

for (int n : result)
std::cout << n << ' '; // 출력: 1 4 9 16
}
```

---

Q5: 두 입력 범위를 변환하는 예시는?
A5:
```cpp
include
include
include

int main() {
std::vector a = {1, 2, 3};
std::vector b = {4, 5, 6};
std::vector result(a.size());

std::transform(a.begin(), a.end(), b.begin(), result.begin(), [](int x, int y) { return x + y; });

for (int n : result)
std::cout << n << ' '; // 출력: 5 7 9
}
```

---

Q6: std::transform의 반환값은 무엇인가요?
A6: 결과를 저장한 출력 범위의 마지막 반복자를 반환합니다. 따라서 변환이 끝난 위치를 알 수 있습니다.

---

Q7: std::transform 사용 시 주의할 점은?
A7:
- 출력 범위에 결과를 저장할 공간이 충분히 확보되어 있어야 합니다.
- 입력과 출력 범위가 겹치면 결과가 예상과 다를 수 있으므로, 겹치지 않도록 주의해야 합니다. (가능한 동일 컨테이너에서 원소를 변환하려면 대상 위치가 입력 범위 뒤쪽에 위치하는 것이 안전합니다.)
- 범위의 크기 일치 여부를 체크해야 합니다.

---

Q8: std::transform는 어떤 헤더 파일에 포함되어 있나요?
A8: `` 헤더 파일에 포함되어 있습니다.

---

Q9: std::transform와 std::for_each의 차이점은?
A9: std::for_each는 각 요소에 대해 어떤 작업을 수행하지만, 결과를 반환하거나 저장하지 않습니다. 반면 std::transform는 변환 결과를 별도의 범위에 저장합니다.

---

Q10: std::transform에 함수 포인터, 함수 객체, 람다식 모두 사용할 수 있나요?
A10: 네, 세 가지 모두 사용할 수 있습니다. std::transform는 함수, 함수 포인터, 함수 객체(functor), 람다식을 모두 받아 동작합니다.

---

추가 참고:
- C++11 이후 std::transform은 병렬 실행 정책과 함께 사용할 수 있지만, 기본 사용법은 위와 같습니다.
- 표준 라이브러리 문서를 참고하면 다양한 변형과 예제를 확인할 수 있습니다.
`std::transform`은 C++ 표준 라이브러리의 알고리즘 중 하나로, 주어진 범위의 요소를 변환하여 다른 범위에 저장하는 데 사용됩니다.

이 함수는 `` 헤더에 정의되어 있으며, 주로 컨테이너의 요소를 변형하거나 계산할 때 유용합니다.

기본 사용법 `std::transform`의 기본 형태는 다음과 같습니다: ```cpp include include include std::transform(InputIterator first1, InputIterator last1, OutputIterator result, UnaryOperation op); ``` - `first1`, `last1`: 변환할 입력 범위의 시작과 끝을 나타내는 반복자입니다.

- `result`: 변환된 결과를 저장할 출력 범위의 시작을 나타내는 반복자입니다.

- `op`: 각 요소에 적용할 변환 함수 또는 함수 객체입니다.

예제 1: 단순 변환 다음은 벡터의 모든 요소를 제곱하는 예제입니다.

```cpp include include include int main() { std::vector vec = {1, 2, 3, 4, 5}; std::vector result(vec.size()); std::transform(vec.begin(), vec.end(), result.begin(), [](int x) { return x * x; }); for (const auto& val : result) { std::cout << val << " "; // 출력: 1 4 9 16 25 } return 0; } ``` 예제 2: 두 범위의 요소를 결합 `std::transform`은 두 개의 입력 범위를 받아서 요소를 결합할 수도 있습니다.

이 경우, 다음과 같은 형태를 사용합니다: ```cpp include include include std::transform(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, OutputIterator result, BinaryOperation op); ``` - `first2`: 두 번째 입력 범위의 시작을 나타내는 반복자입니다.

- `op`: 두 입력 요소를 결합하는 이진 연산자입니다.

다음은 두 벡터의 요소를 더하는 예제입니다.

```cpp include include include int main() { std::vector vec1 = {1, 2, 3, 4, 5}; std::vector vec2 = {10, 20, 30, 40, 50}; std::vector result(vec1.size()); std::transform(vec1.begin(), vec1.end(), vec2.begin(), result.begin(), std::plus()); for (const auto& val : result) { std::cout << val << " "; // 출력: 11 22 33 44 55 } return 0; } ``` 주의사항 1. 출력 범위의 크기 : 출력 범위는 입력 범위와 같은 크기여야 합니다.

그렇지 않으면 정의되지 않은 동작이 발생할 수 있습니다.



2. 반복자 : `std::transform`은 입력과 출력 반복자가 유효한 범위를 가리켜야 합니다.

범위를 벗어난 접근은 프로그램의 충돌을 초래할 수 있습니다.



3. 함수 객체 : 변환 함수는 기본적으로 함수 포인터, 람다 표현식, 또는 사용자 정의 함수 객체일 수 있습니다.

결론 `std::transform`은 C++에서 데이터를 변환하는 데 매우 유용한 도구입니다.

단순한 변환부터 두 개의 범위를 결합하는 복잡한 작업까지 다양한 용도로 활용할 수 있습니다.

이를 통해 코드의 가독성을 높이고, 반복적인 작업을 간결하게 처리할 수 있습니다.

작성자: 최지은 [비회원] | 작성일자: 1년 전 2024-09-20 17:11:39
조회수: 203 | 댓글: 0 | 좋아요: 0 | 싫어요: 0
내용이 부정확하다면 싫어요를 클릭해주세요.