Ein Anwendungsfall trat auf, wenn eine bedingte Kopie (1. machbar mit copy_if), aber von einem Wertecontainer zu einem Container mit Zeigern auf diese Werte (2. machbar mit transform) erstellt werden soll.
Mit den verfügbaren Tools kann ich es nicht in weniger als zwei Schritten tun :
#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 wir nennen könnte remove_ifauf pvund eliminieren die Notwendigkeit für eine temporäre, besser jedoch noch, dann ist es nicht schwer zu implementieren (für einstellige Operationen) so etwas wie folgt aus :
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.
- Gibt es eine elegantere Problemumgehung mit den verfügbaren C ++ - Standardbibliothekswerkzeugen?
- Gibt es einen Grund, warum
transform_ifes in der Bibliothek keine gibt? Ist die Kombination der vorhandenen Tools eine ausreichende Problemumgehung und / oder wird sie als leistungsmäßig angesehen?
transform_ifimpliziert "nur transformieren, wenn ein bestimmtes Prädikat erfüllt ist". Ein aussagekräftigerer Name für das, was Sie wollen, wärecopy_if_and_transform!