Как проверить, возвращают ли значения диапазон :: алгоритмы, такие как find_if? - PullRequest
1 голос
/ 15 октября 2019

Например, если я хочу найти наименьший элемент коллекции, но только наименьший элемент даже , я бы хотел вызвать ranges::min_element с отфильтрованным диапазоном, например:

using ranges::views::filter;
using ranges::min_element;
std::vector<int> vals{1,2,3,4,5};
auto minVal = min_element(vals | filter([](int next){return next % 2 == 0;}));

Как проверить, является ли возвращаемый диапазон пустым, и, если нет, получить доступ к значению?

То же самое относится и к другим алгоритмам диапазона, таким как ranges::find, ranges::find_if и т. Д.

1 Ответ

3 голосов
/ 15 октября 2019

К сожалению, вы не можете передать временный диапазон в алгоритмы диапазонов.

Это потому, что они вернут итератор диапазонов (возможно, ranges::end(rng)) после завершения. Если вы передадите временное значение, возвращенный итератор будет недействительным;ссылка на временный. Библиотека диапазонов обнаруживает это и возвращает фиктивный страж, ranges::dangling вместо итератора.

Правильный способ сделать это - сначала составить отфильтрованный диапазон , а затем вызвать алгоритм.

std::vector<int> vals {1, 2, 3, 4, 5};
auto even_vals = vals | filter([](int val){return val % 2 == 0;});
auto minVal = min_element(even_vals);
if (minVal == even_vals.end())
    std::cout << "no values\n";
else
   std::cout << *minVal; // prints "2"

Демо

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