2016-11-10 5 views
3

Я знаю, что C++ имеют lambdas и std :: bind1st, std :: bind2nd и std :: bind устарели.std :: bind2nd и std :: bind с двумерными массивами и массивами структур

Однако, начните с основ C++, мы сможем понять лучшие новые функции.

Итак, я начинаю с этим очень простым кодом, используя массив Int с:

Первого примера: с стандом :: bind2nd

int array1[] = { 10, 20, 30, 40, 50, 60, 40 }; 
int c1, c2, c3; 

c1 = count_if(array1, array1 + 7, bind2nd(greater<int>(), 40)); 
c2 = count_if(array1, array1 + 7, bind2nd(less<int>(), 40)); 
c3 = count_if(array1, array1 + 7, bind2nd(equal_to<int>(), 40)); 
cout << "There are " << c1 << " elements that are greater than 40." << endl; 
cout << "There are " << c2 << " elements that are lesser than 40." << endl; 
cout << "There are " << c3 << " elements that are equal to 40." << endl; 

Второго примером: с стандом :: bind

greater<int> big; 
less<int> small; 
equal_to<int> equal; 

c1 = count_if(array1, array1 + 7, bind(big, _1, 40)); 
c2 = count_if(array1, array1 + 7, bind(small, _1, 40)); 
c3 = count_if(array1, array1 + 7, bind(equal, _1, 40)); 
cout << "There are " << c1 << " elements that are greater than 40." << endl; 
cout << "There are " << c2 << " elements that are lesser than 40." << endl; 
cout << "There are " << c3 << " elements that are equal to 40." << endl; 

В обоих случаях s выход:

There are 2 elements that are greater than 40. 
There are 3 elements that are lesser than 40. 
There are 2 elements that are equal to 40. 

Как я могу сделать то же самое с двумерных массивов, как показано ниже:
(я хочу, чтобы сделал те же операции с 2-координата)

int array2[7][2] = { { 1, 10 }, { 2, 20 }, { 3, 30 }, 
        { 4, 40 }, { 5, 50 }, { 6, 60 }, { 4, 40 } }; 

И с массивами Структуры, как это:

struct st 
{ 
    char c; 
    int i; 
}; 

st array3[] = { { 'a', 10 }, { 'b', 20 }, { 'c', 30 }, 
       { 'd', 40 }, { 'e', 50 }, { 'f', 60 }, { 'd', 40 } }; 

в этом случае, я хочу сделать те же операции с полем «межд» в массиве структур.

Может ли кто-нибудь мне помочь?

Спасибо

+0

Изучение (использование) 'std :: bind1st',' std :: bind2nd' или 'std :: bind' не поможет вам понять новые функции. – cpplearner

+0

@cpplearner, я согласен с вами. Я упоминал только lambdas, потому что это альтернативный способ выполнить эту работу, но сегодня я заинтересован в использовании std :: bind2nd и std :: bind с структурами данных, о которых я упоминал, т. Е. Двумерными массивами и массивами структур. Это все, что я хочу знать. – user7140484

ответ

2

bind1st, bind2nd и братья их осуждаются в C++ 11 и откровенная удалены в C++ 17. На всякий случай вы этого не знали.

С bind, решение довольно просто, вы можете использовать тот факт, что bind выражения компонуемы и что вы можете использовать bind для извлечения элемента данных (placeholders для краткости опускаем):

auto gr = count_if(array3, array3 + 7, bind(greater<>{}, bind(&st::i, _1), 40)); 
auto ls = count_if(array3, array3 + 7, bind(less<>{}, bind(&st::i, _1), 40)); 
auto eq = count_if(array3, array3 + 7, bind(equal_to<>{}, bind(&st::i, _1), 40)); 

С bind2nd это не так просто. Вам нужно объявить объект функции (не использовать функцию) с несколькими typedef. Вы можете использовать binary_function, чтобы облегчить это:

struct my_greater : binary_function<st, int, bool> 
{ 
    bool operator()(st const& l, int r) const { 
     return greater<>{}(l.i, r); 
    } 
}; 

Тогда вы можете позвонить

auto old = count_if(array3, array3 + 7, bind2nd(my_greater{}, 40)); 

В C++ 11 вы кулачок использовать лямбды:

auto XI = count_if(array3, array3 + 7, [](st const& l){ return l.i > 40}); 

demo of all


Если вы У вас есть C++ 11 или более новый доступ, это почти всегда лучший выбор для использования лямбда. Это не просто «хороший дефолт», вам нужно было бы реально изменить ситуацию на bind, чтобы стать лучшим решением.

+1

Спасибо, мой друг. Вне всякого сомнения, вы являетесь программистом ** GREAT ** C++. – user7140484

 Смежные вопросы

  • Нет связанных вопросов^_^