Я хочу вставить объект 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;
}
Ваш класс сравнения не вызывает строгий порядок. Вы должны изменить его на это:
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
сравнений.
k
ю переменную, только если все сравнения всехi
ых переменных дляi < k
приводят к равенству. Другими словами: если сравнение для переменнойk
дает неравенство (не имеет значения, еслиx<y
илиx>y
), результат должен основываться только на этой переменной, не смотря на переменныеi
дляi > k
.