जब एक आकस्मिक प्रतिलिपि (1. के साथ संभव copy_if
) करने के लिए एक उपयोग मामला उभरा, लेकिन उन मूल्यों के लिए संकेत के एक कंटेनर के लिए मूल्यों के एक कंटेनर से (2. साथ करने योग्य transform
)।
उपलब्ध उपकरणों के साथ मैं इसे दो चरणों से कम में नहीं कर सकता :
#include <vector>
#include <algorithm>
using namespace std;
struct ha {
int i;
explicit ha(int a) : i(a) {}
};
int main()
{
vector<ha> v{ ha{1}, ha{7}, ha{1} }; // initial vector
// GOAL : make a vector of pointers to elements with i < 2
vector<ha*> ph; // target vector
vector<ha*> pv; // temporary vector
// 1.
transform(v.begin(), v.end(), back_inserter(pv),
[](ha &arg) { return &arg; });
// 2.
copy_if(pv.begin(), pv.end(), back_inserter(ph),
[](ha *parg) { return parg->i < 2; }); // 2.
return 0;
}
बेशक हम कह सकते हैं remove_if
पर pv
और एक अस्थायी की आवश्यकता को समाप्त, बेहतर अभी तक हालांकि, यह नहीं मुश्किल करने के लिए लागू (एकल संचालन के लिए) कुछ इस तरह:
template <
class InputIterator, class OutputIterator,
class UnaryOperator, class Pred
>
OutputIterator transform_if(InputIterator first1, InputIterator last1,
OutputIterator result, UnaryOperator op, Pred pred)
{
while (first1 != last1)
{
if (pred(*first1)) {
*result = op(*first1);
++result;
}
++first1;
}
return result;
}
// example call
transform_if(v.begin(), v.end(), back_inserter(ph),
[](ha &arg) { return &arg; }, // 1.
[](ha &arg) { return arg.i < 2; });// 2.
- क्या उपलब्ध C ++ मानक लाइब्रेरी टूल के साथ अधिक सुरुचिपूर्ण वर्कअराउंड है?
- क्या
transform_if
पुस्तकालय में मौजूद नहीं होने का एक कारण है ? क्या मौजूदा साधनों का संयोजन पर्याप्त वर्तन और / या माना जाने वाला प्रदर्शन अच्छा है?
transform_if
अर्थ है "केवल एक निश्चित विधेय संतुष्ट होने पर परिवर्तन।" जो आप चाहते हैं उसके लिए एक अधिक वर्णनात्मक नामcopy_if_and_transform
!