C ++使用.find()将struct作为map中的键

时间:2011-04-13 20:26:34

标签: c++ struct find

我无法访问BOOST或STL我的struct和map看起来类似于以下的psuedo:

 struct s_map_key{
    int a;
    int b;
    bool operator<(const s_map_key& smk) const 
    {
        if (a < smk.a)       
        {            
            return true;
        } else if (a == smk.a)  
        { 
            if (b < smk.b) 
            { 
                return true;
            } 
            else if (b == smk.b)
            {
                return true;
            }
        } 
            return false;
    }
};

int main(int argc, char* argv[])
{

    std::multimap<s_map_key, std::string> myMap;
    for(int i = 0; i <10; i++)
    {
    s_map_key smk;
    smk.a = i;
    smk.b = 2;
    myMap.insert(std::make_pair(smk, "test"));
    }

    s_map_key smk;
    smk.a = 3;
    std::multimap<s_map_key, std::string>::iterator x = myMap.find(smk);
    if(x != myMap.end())
    {
        std::cout << x->first.a <<std::endl;
        std::cout << x->first.b <<std::endl;
    }
    return 0;
}

我要做的是搜索我的多图,查找A = 2,B = 2或A&amp; A的所有情况。 B = 2.我不确定但是,我认为我需要在我的结构中创建谓词来“查找”。想法?

2 个答案:

答案 0 :(得分:4)

operator<就是find或其他任何内容所需的全部内容。但是,您的实现有一个错误。如果操作数相等,则返回true

find和其他标准库组件使用a == b iff ! (a < b) && ! (b < a)的假设,因此,如果ab相等,则<必须为falsefind工作。

        else if (b == smk.b)
        {
            return false; // was true
        }

答案 1 :(得分:0)

除非你想建立等于2 == smk if(smk.a == 2 || smk.b == 2 || smk.a&amp; smk.b == 2),我建议你做谓词外部和使用std :: find_if。如果你使它成为结构的一部分,以便你可以使用multimap的内部查找功能,你可以打开另一个编码器以不希望的方式使用谓词的大门。此外,内部查找函数将仅返回匹配的第一个实例,而使用std :: find_if,您可以更新起始点,以便您可以查找所有实例。如果要使用内部函数,则需要使用equal_range。