Một ca sử dụng xuất hiện khi muốn thực hiện một bản sao theo điều kiện (1. doable with copy_if
) nhưng từ một vùng chứa các giá trị đến một vùng chứa các con trỏ đến các giá trị đó (2. doable with transform
).
Với các công cụ có sẵn, tôi không thể làm điều đó trong ít hơn hai bước:
#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;
}
Ofcourse chúng ta có thể gọi remove_if
vào pv
và loại bỏ sự cần thiết cho một tạm thời, nhưng vẫn tốt hơn, mặc dù nó không phải là khó khăn để thực hiện (đối với hoạt động unary) một cái gì đó như thế này:
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ó giải pháp nào thanh lịch hơn với các công cụ thư viện chuẩn C ++ có sẵn không?
- Có một lý do tại sao
transform_if
không tồn tại trong thư viện? Sự kết hợp của các công cụ hiện có có phải là một giải pháp đầy đủ và / hoặc được coi là hiệu suất hoạt động tốt không?
transform_if
ngụ ý "chỉ biến đổi nếu một vị từ nhất định được thỏa mãn". Một tên mô tả hơn cho những gì bạn muốn sẽ làcopy_if_and_transform
!