Использование std :: any_of, std :: all_of, std :: none_of et c с std :: map - PullRequest
2 голосов
/ 07 января 2020
std::unordered_map<std::string, bool> str_bool_map = {
    {"a", true},
    {"b", false},
    {"c", true}
};

можем ли мы использовать std::any_of на этой карте, чтобы увидеть любое из ее значений false? Или любой из его ключей, скажем, "d"?

Точно так же мы можем использовать std::all_of или std::none_of на этой карте?

Ответы [ 4 ]

5 голосов
/ 07 января 2020

Быстрый ответ: Что происходит, когда вы пытаетесь?

Еще один быстрый ответ: Да

Причина: Глядя на эту страницу мы видим, что std::all_of и друзья ожидать, что:

InputIt должен соответствовать требованиям LegacyInputIterator .

Теперь std::map.begin() возвращает a LegacyBidirectionalIterator

Наконец, взглянув на таблицу здесь , мы увидим, что LegacyBidirectionalIterator является своего рода LegacyInputIterator , поэтому вы можно использовать std::map с std::all_of и друзьями.

5 голосов
/ 07 января 2020

Самое простое решение - использовать лямбду:

std::unordered_map<std::string, bool> str_bool_map = 
    {{"a", true}, {"b", false}, {"c", true}};

bool f = std::any_of(str_bool_map.begin(), str_bool_map.end(),
    [](const auto& p) { return !p.second; });

Здесь лямбда-выражение [](...) { ... } - это унарный предикат, который принимает const auto& p и выполняет тест. const auto& будет выведено в const std::pair<const std::string, bool>& (= std::unordered_map<...>::value_type), поэтому вы используете .second для проверки bool части пары. Используйте элемент .first для проверки ключа элемента.

1 голос
/ 07 января 2020
#include <algorithm>
#include <map>

int main()
{
    std::map<std::string, bool> map;
    map["foo"] = false;
    map["bar"] = true;
    map["baz"] = false;

    const bool any = std::any_of(map.begin(), map.end(), [](const auto& pair)
    {
        return !pair.second;
    });

    const bool all = std::all_of(map.begin(), map.end(), [](const auto& pair)
    {
        return !pair.second;
    });

    const bool none_of = std::none_of(map.begin(), map.end(), [](const auto& pair)
    {
        return !pair.second;
    });
}
1 голос
/ 07 января 2020

Итерация по карте дает пары ключ-значение. Таким образом, вы можете просто передать лямбду алгоритму для распаковки пары ключ-значение.

Чтобы проверить значение, используйте .second:

std::any_of(m.begin(), m.end(), [](const auto& kvp){ return kvp.second; });

Для проверки ключей используйте .first :

std::any_of(m.begin(), m.end(), [](const auto& kvp){ return kvp.first == "d"; }) 

Живой код здесь .

...