cplusplus.com 에 따르면 , std::transform
하나 (1) 또는 두 (2) 범위의 요소에 순차적으로 연산을 적용하고 결과에서 시작하는 범위에 결과를 저장합니다. 의 마지막 인수 std::transform
는 일반적으로 첫 번째 컨테이너의 요소에 대해 몇 가지 작업을 수행하는 함수이지만 다음과 같은 functor 개체가 있다고 가정합니다.
struct functor {
functor(int x) : x(x) {}
int operator()(int x1) {return x + x1;}
private :
int x;
}
그런 다음 함수 대신 다음과 같이 functor의 인스턴스를 전달할 수도 있습니다.
vector<int> v1, v2;
v1.push_back(1);
v1.push_back(2);
v2.resize(v1.size());
std::transform(v1.begin(), v1.end(), v2.begin(), functor(1));
내 질문은 컴파일러가 함수 또는 함수 클래스의 인스턴스가 함수에 전달되었는지 어떻게 알 수 std::transform
있습니까? 또한 인스턴스가 전달되면 첫 번째 컨테이너의 요소에 함수를 적용하는 것과 관련하여 내부적으로 어떤 일이 발생합니까?
std::transform
하나의 범위에 대해 구현이 가능한 템플릿 (하나 또는 두 개의 입력 범위에 대해 두 개의 오버로드) 함수입니다.
template<class InputIt, class OutputIt, class UnaryOperation>
OutputIt transform(InputIt first1, InputIt last1, OutputIt d_first,
UnaryOperation unary_op)
{
while (first1 != last1) {
*d_first++ = unary_op(*first1++);
}
return d_first;
}
그리고 두 범위
template<class InputIt1, class InputIt2,
class OutputIt, class BinaryOperation>
OutputIt transform(InputIt1 first1, InputIt1 last1, InputIt2 first2,
OutputIt d_first, BinaryOperation binary_op)
{
while (first1 != last1) {
*d_first++ = binary_op(*first1++, *first2++);
}
return d_first;
}
마지막 인수에 대한 요구 사항은 operator ()
제공된 반복자를 역 참조하여 얻은 형식에 적용 할 수 있어야한다는 것입니다 (즉, 인수와 반환 형식은 암시 적으로 변환 가능합니다). 따라서 일반 함수, 람다 또는 이러한 연산자가있는 모든 사용자 유형이 될 수 있습니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다