繁体   English   中英

如何在搜索中不使用std :: map的自定义比较功能(map :: find)?

[英]How not to use custom comparison function of std::map in searching ( map::find)?

如您在我的代码中lenMaplenMap是带有自定义比较功能std::map 此函数仅检查字符串的长度。

现在,当我想搜索一些键(使用map::find )时,地图仍然使用该自定义比较功能。

但是,当我搜索某些密钥时,如何强制我的地图不使用它

码:

struct CompareByLength : public std::binary_function<string, string, bool>
{
    bool operator()(const string& lhs, const string& rhs) const
    {
        return lhs.length() < rhs.length();
    }
};

int main()
{
    typedef map<string, string, CompareByLength> lenMap;
    lenMap mymap;

    mymap["one"] = "one";
    mymap["a"] = "a";
    mymap["foobar"] = "foobar";

    // Now In mymap: [a, one, foobar]

    string target = "b";
    if (mymap.find(target) == mymap.end())
        cout << "Not Found :) !";
    else
        cout << "Found :( !"; // I don't want to reach here because of "a" item !

    return 0;
}

地图本身不提供这种操作。 比较函子的想法是创建内部排序以加快查找速度,因此实际上根据您的函子对元素进行排序。

如果需要以其他方式搜索元素,则可以使用STL算法std::find_if() (具有线性时间复杂度),也可以创建使用另一个比较函子的第二张地图。

在您的特定示例中,由于您似乎只对字符串的长度感兴趣,因此应该使用长度(类型为std::size_t )而不是字符串本身作为键。

顺便说一句,不需要std::binary_function作为基类。 从C ++ 11开始,甚至不再使用它,例如,请参见此处

比较功能告诉地图如何排序元素以及如何区分元素。 如果仅比较长度,则具有相同长度的两个不同字符串将占据映射中的相同位置(一个将覆盖另一个)。

将您的字符串存储在其他数据结构中并对其进行排序,或者尝试使用此比较功能:

struct CompareByLength
{
    bool operator()(const string& lhs, const string& rhs) const
    {
        if (lhs.length() < rhs.length())
        {
            return true;
        }
        else if (rhs.length() < lhs.length())
        {
            return false;
        }
        else
        {
            return lhs < rhs;
        }
    }
};

我没有进行测试,但是我相信这将首先按长度对字符串进行排序,然后通常将字符串进行比较。

您还可以使用std::map<std::string::size_type, std::map<std::string, std::string>>并将长度用于第一张地图,并将字符串值用于第二张地图。 您可能希望将其包装在一个类中,以使其更易于使用,因为没有防止将其弄乱的保护措施。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM