Ich habe Code, um alle Elemente aus einem std::vector<int>
zu entfernen, die weniger als einige int limit
sind. Ich habe einige Funktionen geschrieben, die Lambda-Ausdrücke teilweise gelten:So emulieren remove_unless
auto less_than_limit = [](int limit) {
return [=](int elem) {
return limit > elem;
};
};
auto less_than_three = less_than_limit(3);
Wenn ich es mit std::vector<int> v{1,2,3,4,5};
testen, ich die erwarteten Ergebnisse erhalten:
for(auto e: v) {
std::cout << less_than_three(e) << " ";
}
// 1 1 0 0 0
Ich kann alle Elemente leicht entfernen weniger als drei:
auto remove_less_than_three = std::remove_if(std::begin(v), std::end(v), less_than_three);
v.erase(remove_less_than_three, v.end());
for(auto e: v) {
std::cout << e << " ";
}
// 3 4 5
Wie würde ich Elemente größer als oder gleich 3 mit less_than_three
entfernen?
Ich versuchte less_than_three
in std::not1
Einwickeln, aber Fehler bekam:
/usr/local/Cellar/gcc/5.3.0/include/c++/5.3.0/bits/stl_function.h:742:11: error: no type named 'argument_type' in 'struct main()::<lambda(int)>::<lambda(int)>'
class unary_negate
^
/usr/local/Cellar/gcc/5.3.0/include/c++/5.3.0/bits/stl_function.h:755:7: error: no type named 'argument_type' in 'struct main()::<lambda(int)>::<lambda(int)>'
operator()(const typename _Predicate::argument_type& __x) const
/usr/local/Cellar/gcc/5.3.0/include/c++/5.3.0/bits/predefined_ops.h:234:30: error: no match for call to '(std::unary_negate<main()::<lambda(int)>::<lambda(int)> >) (int&)'
{ return bool(_M_pred(*__it)); }
^
Ich habe dann versucht std::not1(std::ref(less_than_three))
, bekam aber diese Fehler:
/usr/local/Cellar/gcc/5.3.0/include/c++/5.3.0/bits/stl_function.h:742:11: error: no type named 'argument_type' in 'class std::reference_wrapper<main()::<lambda(int)>::<lambda(int)> >'
class unary_negate
^
/usr/local/Cellar/gcc/5.3.0/include/c++/5.3.0/bits/stl_function.h:755:7: error: no type named 'argument_type' in 'class std::reference_wrapper<main()::<lambda(int)>::<lambda(int)> >'
operator()(const typename _Predicate::argument_type& __x) const
^
/usr/local/Cellar/gcc/5.3.0/include/c++/5.3.0/bits/predefined_ops.h:234:30: error: no match for call to '(std::unary_negate<std::reference_wrapper<main()::<lambda(int)>::<lambda(int)> > >) (int&)'
{ return bool(_M_pred(*__it)); }
^
Wie kann ich die Funktion in std::remove_if
negieren, ohne die sich wandelnde Logik meiner Lambdas? Mit anderen Worten, wie kann ich remove_unless
emulieren?
ich Sie davon ausgehen, habe aus irgendeinem Grund Ihre Lambda von einem anderen Lambda des Aufrufs der offensichtliche Wahl ausgeschlossen? –
@BenjaminLindley Ja, ich weiß, dies ist die klare und vernünftige Wahl. Dies ist nur für Bildungszwecke. – erip
Das muss etwas mit dem Lambda-Typ zu tun haben. Sie sollten den Typ von 'less_then_three' explizit machen. 'std :: function less_than_three = weniger_than_limit (3);' –
Gene