C ++ Lambda reference vs copy [duplicate]

Есть несколько хороших примеров для этого в R Wiki . Я украду пару здесь:

Метод слияния

Поскольку ваши ключи называются одинаковыми, короткий способ сделать внутреннее соединение - merge ():

merge(df1,df2)

полное внутреннее соединение (все записи из обеих таблиц) может быть создано с помощью ключевого слова «все»:

merge(df1,df2, all=TRUE)

левое внешнее соединение df1 и df2:

merge(df1,df2, all.x=TRUE)

правое внешнее объединение df1 и df2:

merge(df1,df2, all.y=TRUE)

вы можете перевернуть их, пощекотать их и протрите их, чтобы получить другие два внешних соединения, о которых вы спрашивали:)

Метод подстроки

Левое внешнее соединение с df1 слева с использованием метода подстроки будет:

df1[,"State"]<-df2[df1[ ,"Product"], "State"]

Можно создать и другую комбинацию внешних соединений путем макетирования примера нижнего нижнего соединения. (да, я знаю, что это эквивалент слова «Я оставлю это как упражнение для читателя ...»)

7
задан iFreilicht 6 May 2014 в 17:01
поделиться

1 ответ

Каждое выражение лямбда генерирует уникальный объект функции (замыкание), который сохраняет захваченные переменные в качестве элементов данных. Например, выражение lambda в вашем коде будет преобразовано в компилятор таким образом:

struct __uniquely_named_lambda
{
  __uniquely_named_lambda(int& pos)
  : pos(pos) {}
  int& pos;

  void operator()() const
  { ++pos; }
};

Вызов лямбда - это просто вызов operator().

элемент данных является ссылкой, поскольку вы захватили по ссылке. Если вы захватили по значению, это будет простой int. Также обратите внимание, что сгенерированный operator() по умолчанию const. Вот почему вы не можете изменять захваченные переменные, если не используете ключевое слово mutable.

9
ответ дан Praetorian 21 August 2018 в 17:24
поделиться
  • 1
    Обратите внимание, однако, что выше не в точности то, что происходит. В отличие от магии for и, как и большинство остальных C ++, это стандартизированное поведение, и это поведение не кодируется в коде C ++. В частности, вышеупомянутая "поддельная" У lambda есть конструктор - самим лямбдам не нужно их (они могут делать это через магию). Кроме того, если вы передаете вышеупомянутую «фальшивку», lambda reference, он остается действительным до тех пор, пока ссылочные данные действительны - для реальной лямбды технически требуются как данные , так и , эта ссылочная переменная, которую она зафиксировала, остается действительной. – Yakk - Adam Nevraumont 6 May 2014 в 18:53
  • 2
    @Yakk: В соответствии с правилом as-if компиляторы всегда имели возможность реализовать C ++ любым способом, чтобы найти подходящее, если наблюдаемое поведение идентично. Существование конструкторов не наблюдается. – MSalters 7 May 2014 в 10:55
  • 3
    @msalters Используйте тип дедукции, а затем классы признаков. Некоторые из них отличаются в зависимости от существования конструктора. Неявные унарные ctors могут быть обнаружены (даже если частные) с помощью перегрузок функций (опять же, введите с помощью вывода типа), но не уверены, могу ли я сделать то же самое с явным или несколькими аргументами (thinkimg {} с перегрузками?) - - Я не убежден, что это не наблюдаемо, но не обязательно. – Yakk - Adam Nevraumont 7 May 2014 в 12:13
Другие вопросы по тегам:

Похожие вопросы: