понимание std :: find_if () с использованием lamda в std :: pair - PullRequest
0 голосов
/ 28 ноября 2018

Насколько я понимаю, std::find_if() below возвращает итератор для первого элемента в диапазоне arg, для которого третий аргумент (функция lamda) возвращает true.Это верно?

Может ли кто-нибудь объяснить, почему нет итератора, определенного таким образом std::pair<std::string, std::type_index>::iterator = std::find_if(...)?

Где хранится итератор, возвращаемый std::find_if(), и как вы можете вызвать ->second самостоятельноа не на итераторе?

std::type_index argType(const std::string& name) const
{
    return std::find_if(args_.begin(), args_.end(),
        [&name](std::pair<std::string, std::type_index> arg)->bool
        {
            return arg.first == name;
        }
    )->second;
}

1 Ответ

0 голосов
/ 28 ноября 2018

Насколько я понимаю, std::find_if() ниже возвращает итератор

Да, но этот итератор затем разыменовывается в том же выражении.Функция возвращает копию std::type_index из некоторого элемента args_, который, предположительно, является каким-либо стандартным контейнером с value_type из std::pair<std::string, std::type_index> (или аналогичным).

По предположению, это std::vector<std::pair<std::string, std::type_index>>, потому что если бы это была карта, вся функция могла бы быть упрощена до

return args_.at(name);

Может кто-нибудь объяснить, почему нет итератораопределяется следующим образом: std::pair<std::string, std::type_index>::iterator = std::find_if(...)?

Ну, во-первых, std::pair не имеет члена iterator.Я предполагаю, что вы имели в виду std::vector<std::pair<std::string, std::type_index>>::iterator (или какой бы тип коллекции args_ не был).

Не требуется отдельного оператора, объявляющего такой итератор, во многом так же, как вам не нужен отдельный double в выражении

return floor(3.14 * radius);

, когдаВы хотите вычисление целочисленной окружности.

Где итератор, возвращаемый std::find_if(), хранится

Везде, где нравится компилятор.Он существует только во время вычисления оператора возврата.

как вы можете вызвать ->second самостоятельно

Вы не можете.Вы вызываете его по временному значению, возвращенному std::find_if

, и почему после закрывающей скобки std::find_if?

есть != args_.end() Нетт.Автор предполагает , что они найдут соответствующий элемент.Если они этого не делают, программа имеет неопределенное поведение.Это может быть преднамеренным, или это может быть ошибка.

...