0

次のコードがあります。

#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ここで、 map として宣言falseし、2 項述語に入れると、出力は次のようになります: 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述語の戻り値は、要素を前に置くか後ろに置くかを伝えるだけだと思いました。しかし、これがマップ自体のサイズにどのように影響するかわかりません..これに光を当ててください。ありがとうございました。

4

1 に答える 1

2

比較は厳密な弱い順序付けを実装する必要があります。を使用する場合、この要件は満たされません。

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
}
于 2013-04-11T06:53:33.137 に答える