поведение двоичного предиката для карты STL и мультикарты ….

У меня есть следующий код:

#include <iostream>
#include <stdio.h>
#include <cmath>
#include <map>
using namespace std;
struct vals
{
int cods[5];
int sz;
};
struct myComp
{
bool operator()(vals A, vals B) const
{
int i=0;
while(A.cods[i]==B.cods[i] && i<A.sz)
i++;
if(i==A.sz)
return false; //<-----this is the value im changing..
else
return A.cods[i] > B.cods[i];
}
};
map< vals, int, myComp> Mp;
int main()
{
vals g, h;
g.sz=h.sz=3;
g.cods[0] = 12;
g.cods[1] = 22;
g.cods[2] = 32;
Mp.insert(pair< vals, int >(g,4));
Mp.insert(pair< vals, int >(g,7));
cout<<Mp.count(g)<<endl;
cout<<Mp.size()<<endl;
return 0;
}

Теперь, когда объявляют Mp как карту и положить false в двоичном предикате ..
Выход:
1
1

Mp => map && binary predicate:true ==> output: 0 2

Mp => multimap && binary predicate:true ===> output: 0 2

Mp => multimap && binary predicate:false ===> output: 2 2

Я думал, что возвращаемое значение предиката просто говорит stl ставить ли элемент перед ним или за ним. Но я не понимаю, как это влияет на размер самой карты ..
Пожалуйста, пролите немного света на это. Спасибо.

0

Решение

Ваше сравнение должно реализовать строгий слабый порядок. Это требование не выполняется при использовании

if(i==A.sz)
return true;

в вашем компараторе. В этом случае все элементы в массивах одинаковы. Функтор не может вернуться true если оба его аргумента равны. Карта не может функционировать правильно, если у вас нет строгого сравнения слабых порядков.

Вы можете значительно упростить свой функтор, используя std::lexicographical_compare:

#include <algorithm>  // for std::lexicographical_compare
#include <functional> // for std::greater

...

bool operator()(vals A, vals B) const
{
return std::lexicographical_compare(A, A+A.sz, B, B+B.sz); // less-than
//return std::lexicographical_compare(A, A+A.sz, B, B+B.sz, std::greater<int>()); // gt
}
2

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector