Вопрос о грамматике c ++ [stati c const auto Compare = [] (const std :: string & now, const std :: string & next) noexcept -> bool] - PullRequest
0 голосов
/ 21 февраля 2020
static const auto compare = [](const std::string& now, const std::string& next) noexcept ->bool 
    {
        return now.size() == next.size() ? now < next : now.size() < next.size();
    };

Я видел этот код в ранге Хакера, и я не понимаю, как он работает.

Q1. Почему этот парень использовал stati c const auto и const std :: string Q2. Что значит ? Q3. Почему строка &? не строка Q4. что означает noexcept -> bool?

Будем благодарны за любые комментарии!

Ответы [ 3 ]

0 голосов
/ 21 февраля 2020

Я не уверен, следует ли на этот вопрос ответить или закрыть с помощью универсального дубликата c относительно лямбда-синтаксиса, но здесь так много всего происходит, что я испытываю желание объяснить это шаг за шагом.

Прежде всего, я предлагаю получить хорошую книгу для изучения C ++ (особенно ту, которая охватывает C ++ 11), а не HackerRank или любой другой сайт "конкурентного программирования". Написанный там код редко можно назвать «хорошим», и решения, предоставляемые другими (как вы заметили), обычно просто сводят на нет их собственные знания, а не делятся ими с другими.

То, что вы видите, это один лямбда-выражение . Он определяет лямбду с именем compare, которая принимает два const std::string& в качестве аргументов и возвращает bool. Скорее всего, позже он будет использован в функции из библиотеки <algorithm>. Упрощенно, лямбда - это короткий синтаксис для функции, который можно вызвать позже где-нибудь еще.

Лямбда-синтаксис выглядит следующим образом:

[ capture-list ] ( parameters ) optional-qualifiers -> return-type { body } 

Ваша лямбда имеет:

  • пустой список захвата (он работает только с параметрами, указанными при каждом вызове)
  • два аргумента типа const std::string&, которые передаются при каждом вызове лямбды.
  • noexcept Квалификатор - программист обещает, что эта лямбда
  • тип возвращаемого значения bool
  • тело отдельной строки return now.size() == next.size() ? now < next : now.size() < next.size();

Относительно переменной compare не выдаст исключений *, есть несколько ключевых слов, используемых для его определения:

  • static сильно зависит от контекста - это означает что-то другое в области видимости класса и в пространстве имен. Подробнее в этом вопросе
  • const совершенно очевидно - эта переменная не изменится. Требуется для инициализации static членов класса на месте.
  • auto - пусть компилятор выводит тип переменной. Лямбды не имеют общего имени для типа, поэтому auto или std::function<> - это только варианты, которые можно использовать.

Наконец:

Q3. Почему строка &? не строка

Почему бы и нет? Нет абсолютно никакой причины копировать аргументы в лямбду, поэтому намного быстрее передавать их по ссылке. Подробнее об этом topi c: В чем разница между передачей по ссылке и передачей по значению?

0 голосов
/ 21 февраля 2020

Q1. Почему этот парень использовал stati c const auto и const std :: string

Почему бы и нет? Я не автор, поэтому я не могу ответить точно. Без контекста я не могу даже сделать разумное предположение.

Q2. Что означает []?

Это часть синтаксиса лямбда-выражения. Это список захвата, и он пуст.

Q3. Почему строка &? не строка

Предположительно, потому что копирование строк потенциально медленное.

Q4. Что означает noexcept -> bool?

Noexcept означает, что функции не разрешено генерировать. -> bool является типом возврата функции.

0 голосов
/ 21 февраля 2020

Это называется Лямбда-выражение

Используемый здесь синтаксис:

[захваты] (параметры) -> ret {body}

Вы можете думать о лямбде как о любой переменной в C++

Q1. Почему этот парень использовал stati c const auto и const std :: string?

A1. static const auto имеет то же значение, что и для static const auto x = 1;, const std::string, чтобы предотвратить изменение аргумента внутри лямбда-тела.

Q2. Что означает []?

A2. Это синтаксис лямбда-захвата, вы можете указать, что будет видно внутри лямбда-тела.

Q3. Почему строка &?

A3. Передача std::string по ссылке, чтобы избежать копирования.

Q4. что означает noexcept -> bool?

A4. noexcept сообщает компилятору, что код не генерирует исключения. -> bool - код возврата лямбды.

...