Заставить код работать на unordered_map
В этом случае мы можем сделать это, просто изменив тип с map
на unordered_map
.
До:
template <class Key, class Value>
std::pair<Key, Value> findMaxValuePair(
std::map<Key, Value> const &x)
{
return *std::max_element(x.begin(), x.end(),
[](const std::pair<Key, Value> &p1,
const std::pair<Key, Value> &p2)
{
return p1.second < p2.second;
});
}
После: мы изменили тип на unordered_map
.
template <class Key, class Value>
std::pair<Key, Value> findMaxValuePair(
std::unordered_map<Key, Value> const &x)
{
return *std::max_element(x.begin(), x.end(),
[](const std::pair<Key, Value> &p1,
const std::pair<Key, Value> &p2)
{
return p1.second < p2.second;
});
}
Заставить код работать для обоих
Мы можем написать функцию, которая действительно просто работает со всеми стандартными контейнерами! Это будет работать для карт, векторов, списков и почти всего остального, что определяет begin()
, end()
и value_type
!
template <class Container>
auto findMaxValuePair(Container const &x)
-> typename Container::value_type
{
using value_t = typename Container::value_type;
const auto compare = [](value_t const &p1, value_t const &p2)
{
return p1.second < p2.second;
};
return *std::max_element(x.begin(), x.end(), compare);
}
А как насчет сегфо?
Этот код может вызвать ошибку, если карта или контейнер пусты, либо потому, что вы обращаетесь к памяти, которой вы не владеете; потому что память, на которую указывает map::end()
, содержит мусор, из которого вы затем пытаетесь создать что-то вроде строки, или потому что он представлен как нулевой указатель.
В частности, для карт, если имеется повреждение памяти, это также может привести к segfault, хотя это будет верно независимо от того, как вы пытались выполнить итерацию по карте.