Функция поиска не работает

0

Я хочу вставить объект struct one как уникальный ключ на карте. Поэтому я написал функцию operator() но find не работает, даже элемент существует на карте.

#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;
}
Теги:
find
map

1 ответ

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 сравнений.

  • 0
    @BartoszKP Если есть три переменные, то как мне поступить в этом случае?
  • 0
    @ Sawaan Таким же образом, иерархически. Вы проверяете k ю переменную, только если все сравнения всех i ых переменных для i < k приводят к равенству. Другими словами: если сравнение для переменной k дает неравенство (не имеет значения, если x<y или x>y ), результат должен основываться только на этой переменной, не смотря на переменные i для i > k .

Ещё вопросы

Сообщество Overcoder
Наверх
Меню