Использовать bind1st или bind2nd? - PullRequest
5 голосов
/ 28 июля 2011
vector<int> vwInts;
vector<int> vwIntsB;

for(int i=0; i<10; i++)
    vwInts.push_back(i);

transform(vwInts.begin(), vwInts.end(), inserter(vwIntsB, vwIntsB.begin()),
        bind1st(plus<int>(), 5)); // method one

transform(vwInts.begin(), vwInts.end(), inserter(vwIntsB, vwIntsB.begin()),
        bind2nd(plus<int>(), 5)); // method two

Я знаю разницу в использовании между bind1st и bind2nd, и оба метода один и метод два дают ожидаемые результаты для меня.

Правда ли, что в этом случае нет большой разницы (то есть использование преобразования), так что я могу использовать либо bind1st, либо bind2nd?

Поскольку во всех примерах, которые я видел до сих пор, всегда используется второй метод. Я хотел бы знать, одинаковы ли bind1st и bind2nd в приведенном выше случае.

Ответы [ 4 ]

6 голосов
/ 28 июля 2011

bind1st связывает первый параметр функтора plus<int>(), а bind2nd связывает второй параметр. В случае plus<int> это не имеет значения, поскольку 10+20 и 20+10 одинаковы.

Но если вы сделаете это с minus<int>, это будет иметь значение, поскольку 10-20 и 20-10 не одинаковы. Просто попробуйте это сделать.

Иллюстрация:

int main () {
  auto p1 = bind1st(plus<int>(),10);
  auto p2 = bind2nd(plus<int>(),10);
  cout << p1(20) << endl;
  cout << p2(20) << endl;

  auto m1 = bind1st(minus<int>(),10);
  auto m2 = bind2nd(minus<int>(),10);
  cout << m1(20) << endl;
  cout << m2(20) << endl;
  return 0;
}

Выход:

 30
 30
-10
 10

Демо: http://ideone.com/IfSdt

4 голосов
/ 28 июля 2011

bind1st связывает первый параметр функции, в то время как bind2nd связывает второй параметр. Поскольку в этом случае два типа параметров одинаковы, а operator+ симметричен, разница не имеет.

3 голосов
/ 28 июля 2011

В этом случае они будут переводиться соответственно в 5 + a и a + 5, что будет скомпилировано точно так же.

0 голосов
/ 31 июля 2016

Для вашего конкретного случая

bind1st()

и

bind2nd()

являются одинаковыми .

Таким образом, потому что plus() оператор двоичной функции выглядит следующим образом

plus(arg1, arg2)

Итак, когда вы используете bind1st(plus<int>(), 5) вызов плюс будет выглядеть как под

plus(5, vwInts)

Итак, выше будет добавлен каждый элемент вектора со значением 5

И когда вы используете bind2nd(plus<int>(), 5) вызов плюс будет выглядеть как под

plus(vwInts, 5)

Итак, выше будет добавлен каждый элемент вектора со значением 5.

Следовательно оба одинаковы в вашем случае

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...