时间复杂度为O(log(n))的多Map中如何有效地搜索一个值?
我有一个多重Map,其中键表示位置,值表示城市名称。我想根据给定的城市名称在多重Map中有效地搜索特定的城市名称。
这就是数据结构:
std::multimap < Location, std::string, LessX > _mmapCitiesX;
下面是我实现的搜索功能(这是工作):
City CitiesManager::findCity(const std::string& cityName) const
{
auto it = std::find_if(_mmapCitiesX.begin(), _mmapCitiesX.end(),
[&](const City& city) {
return city.second == cityName;
});
if (it == _mmapCitiesX.end()) {
throw std::runtime_error(cityName +
" isn't found in the city list. Please try again");
}
return *it;
}
(City是std::pair<Location,std::string>,Location是一个带x,y线的结构体)
为了降低复杂性,我尝试使用std::equal_range,但它不起作用。
以下是我尝试:
City CitiesManager::findCity(const std::string& cityName) const
{
auto range = std::equal_range(_mmapCitiesX.begin(), _mmapCitiesX.end(),
cityName, [](const City& city, const std::string& name) {
return city.second < name;
});
if (range.first == range.second) {
throw std::runtime_error(cityName +
" isn't found in the city list. Please try again");
}
return *(range.first);
}
我收到错误:
C2664 'bool CitiesManager::findCity:::<lambda_1>:operator()(const City &,const std::basic_string<char,std::char_traits,std::allocator> &)const':无法将参数% 1从“const _Ty”转换为“const City &”
edit:这是LessX,我需要它,因为我想按x-chords对位置进行排序,因此我选择使用位置作为键。
struct LessX
{
bool operator()(const Location& left, const Location& right) const
{
return left._x < right._x;
}
};
我会很感激任何帮助
1条答案
按热度按时间z4iuyo4d1#
即使你修复了你的调用点,你也忽略了
std::equal_range
的前置条件,所以你的程序是病态的。如果希望同时按位置和名称进行查找,则需要提供这种查找的数据结构。
boost::bimap
或boost::multi_index
是可以提供此功能的容器。