c++ 时间复杂度为O(log(n))

tvz2xvvm  于 2023-05-20  发布在  其他
关注(0)|答案(1)|浏览(140)

时间复杂度为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;
    }
};

我会很感激任何帮助

z4iuyo4d

z4iuyo4d1#

即使你修复了你的调用点,你也忽略了std::equal_range的前置条件,所以你的程序是病态的。
如果希望同时按位置和名称进行查找,则需要提供这种查找的数据结构。boost::bimapboost::multi_index是可以提供此功能的容器。

相关问题