一元和二元否定器的用處很容易理解。如何編寫n-ary否定符?
與一元否定符(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";
輸出:
We have 4 even elements in the array.
We have 5 odd elements in the array.
實施例具有二進制否定符(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";
輸出:
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
什麼n元非門(NOT3,not4,NOT5 ... notn)?
讓我們假設我需要計算之間的元素數量,而不是之間的兩個數字(下限和上限)集合(可能是一個數組)。
.
int elems_betweem = count_if(values, values + n, not3(bind(Between<int>(), _1, lowerValue, upperValue)));
.
我如何寫NOT3否定器?
更有甚者,我們是否有一個通用的not
作爲not1
和not2
以同樣的方式爲bind
VS bind1st
和bind2nd
一個替代品?
謝謝
這裏你不需要'not3' - bind(在(),_1,lowerValue,upperValue)之間''會創建一個一元運算符,所以你只需要一個'not1'。 –
Holt
C++ 17被提議引入:'std :: not_fn',它可以用於任何arity。 – user2079303
在你的例子中,你將需要'not1'而不是'not3'。 'bind(在(),_1,lowerValue,upperValue)之間的返回值'是一個可調用的參數,而不是3. –