查找功能不起作用

时间:2013-11-21 15:48:26

标签: c++ map find

我想在结构中插入struct one的对象作为唯一键。所以我写了operator()函数,但find无效,即使元素存在于map中。

#include <iostream>
#include<map>
#include <stdio.h>
#include <string.h>
#include <math.h>
using namespace std;
struct one
{
    char* name_;
    double accuracy_;
    one(char* name, double accuracy)
        {
                name_ = name;
                accuracy_  = accuracy;
        }
};
const float Precision  =  0.000001;
struct CompLess:public std::binary_function<const one, const one, bool>{
    bool operator()(const one p1, const one p2) const
    {
        if (strcmp(p1.name_, p2.name_)<0)
        {
            return true;
        }
        if(((p1.accuracy_) - (p2.accuracy_)) < Precision and
            fabs((p1.accuracy_) - (p2.accuracy_))> Precision)
        {
            return true;
        }
        return false;
    }
};

typedef map<const one,int,CompLess> Map;

int main( )
{
    one first("box",30.97);
    one first1("war",20.97);
    Map a;
    a.insert(pair<one,int>(first,1));
    a.insert(pair<one,int>(first1,11));
    if(a.find(first1) == a.end())
    {
        cout<<"Not found"<<endl;
    }
    else
    {
        cout<<"Found"<<endl;
    }
    return 0;
}

1 个答案:

答案 0 :(得分:0)

您的比较课程没有引入严格的排序。您应该将其更改为:

bool operator()(const one p1, const one p2) const
{
    if (strcmp(p1.name_, p2.name_) == 0)
    {
        if (((p1.accuracy_) - (p2.accuracy_)) < Precision and
            fabs((p1.accuracy_) - (p2.accuracy_))> Precision)
        {
            return true;
        }
    }

    return false;
}

在您的版本中first1小于first,因为strcmp("war", "box") > 0(第一个条件为false)和20.97 < 30.97(第二个条件为true ),但同时first小于first1,因为strcmp("box", "war") < 0(第一个条件是true)。只有在第一个维度相等时才应比较第二个维度 - 这是less比较的良好经验法则。