Die Nützlichkeit von unären und binären Negatoren ist leicht verständlich.Wie schreibe ich einen n-ary Negator?
Beispiel mit unären Negator (Not1):
class Even
{
public:
bool operator() (const int& x) const { return x % 2 == 0; }
typedef int argument_type;
};
int values[] = { 9, 1, 8, 2, 7, 3, 6, 4, 5 };
int even = count_if(values, values + 9, Even());
int odd = count_if(values, values + 9, not1(Even())); // <= unary negator
cout << "We have " << even << " even elements in the array.\n";
cout << "We have " << odd << " odd elements in the array.\n";
Output:
We have 4 even elements in the array.
We have 5 odd elements in the array.
Beispiel mit binären Negator (NOT2):
int values[] = { 9, 1, 8, 2, 7, 3, 6, 4, 5 };
// original array
for (int i : values)
cout << i << " ";
cout << "\n";
// array in ascending order
sort(values, values + 9, less<int>());
for (int i : values)
cout << i << " ";
cout << "\n";
// array in descending order
sort(values, values + 9, not2(less<int>())); // <= binary negator
for (int i : values)
cout << i << " ";
cout << "\n\n";
Ausgang:
9 1 8 2 7 3 6 4 5
1 2 3 4 5 6 7 8 9
9 8 7 6 5 4 3 2 1
Was ist n-ary Negatoren (NOT3, NOT4, not5 ... nichtn)?
Angenommen, ich muss die Anzahl der Elemente zählen, die nicht zwischen zwei Zahlen (untere Grenze und obere Grenze) in einer Sammlung (möglicherweise ein Array) zählen.
.
int elems_betweem = count_if(values, values + n, not3(bind(Between<int>(), _1, lowerValue, upperValue)));
.
Wie schreibe ich die NOT3 negator?
Noch mehr, machen wir eine generische not
als Ersatzstoff von not1
und not2
in der gleichen Weise wie bind
vs bind1st
und bind2nd
haben?
Danke
Sie brauchen nicht 'not3' here -' bind (Zwischen(), _1, lowerValue, obererWert) 'erstellt einen unären Operator, Sie brauchen also einfach ein' not1'. –
Holt
C++ 17 wird vorgeschlagen, einzuführen: 'std :: not_fn', die für jede Arity funktionieren würde. – user2079303
In Ihrem Beispiel benötigen Sie 'not1' und nicht' not3'. Der Rückgabewert von 'bind (Between(), _1, lowerValue, obererValue)' ist ein Callable unter Verwendung eines Parameters und nicht 3. –