我想使用指定的equal_to函数int unordered_set
示例代码如下:

struct myEqual
{       //string with one different character is considered equal
    bool operator()(const string &s1, const string &s2)const
    {

        if(s1.length() != s2.length()) return false;
        int dis = 0;
        for(unsigned int i = 0; i<s1.size(); i++)
        {
            if(s1[i] != s2[i])
            {
                dis++;
                if(dis >= 2) return false;
            }
        }
        return true;
    }
};

int main()
{
    unordered_set<string, std::tr1::hash<string>, myEqual> myDict;
    myDict.insert("a");
    myDict.insert("b");
    myDict.insert("c");

    unordered_set<string, std::tr1::hash<string>, myEqual>::iterator it = myDict.find("k");
    if(it == myDict.end())
    {
        cout<<"myequal not work"<<endl;
    }
    else
    {
        cout<<*it<<endl;
    }
    return 0;
}

根据myEqual函数,存在三个等于“k”的值“a”,“b”,“c”,但是find只返回一个迭代器。
无论如何,有没有找到所有相等的值(value)?

最佳答案

这里有两个问题,这两个问题都不与查找元素有关:

  • 由于"a""b""c"彼此相等,因此您只能在unordered_set中保留其中之一。
  • 您具有比较相等的元素,但可能具有不同的哈希码。这违反了您必须履行的契约(Contract)才能使无序集合正常工作。

  • 需要记住的一个更普遍的问题是您的等效关系不是传递的:"aa"等于"ab",而"ab"等于"bb"。但是"aa"不等于"bb"

    关于c++ - 使用find在unordered_set中查找多个值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14858234/

    10-13 08:29