2

次のように、要素の構造体をセットに挿入する必要があります。

// In hpp file at private part of a class:
struct BestPair {
        unsigned int p1;
        unsigned int p2;
        double goodness;

        bool operator<(BestPair other) const                      // Set descendent order.                                    
        {
            return goodness > other.goodness;
        }
    };

セットは子孫順でなければなりません。

// at the cpp file, inside a method of the same class
void Pairs::fillGlobalStack (double *** source, unsigned int sz)
{
    BestPair bp;

    for (unsigned int i = 0; i != sz; ++i) {
        for (unsigned int j = i+1; j != sz; ++j) {
            bp.p1 = i;        
            bp.p2 = j;
            bp.goodness = (* source) [i][j];
            global_stack.insert (bp);                          // Insert into global stack.                                   
            if (debug) {
                cout << "[fillGlobalStack] i: " << i << "  j: " << j << "  goodness: " << bp.goodness << "  global_stack.size\
() " << global_stack.size() << endl;
            }
        }
    }
}

しかし、実行すると、コードは 3 番目、4 番目などの要素を挿入しません。これらは異なる要素であるため、私には奇妙に思えます。

// The output:
[fillGlobalStack] p1: 0  p2: 1  goodness: 0  global_stack.size() 1
[fillGlobalStack] p1: 0  p2: 2  goodness: 0.794  global_stack.size() 2
[fillGlobalStack] p1: 0  p2: 3  goodness: 0.794  global_stack.size() 2  <-- It should be 3

私は何を間違っていますか?それを解決する方法は?

4

2 に答える 2

3

2 つの要素が等しい場合goodness、それらは等しいと見なされ、 に格納できませんsetmultiset重複を許可する場合は、代わりに使用してください。

一般に、どちらでもない場合、要素は等しいと見なされますa < bb < a

完全な重複を許可したくないが、重複を許可しgoodnessたい場合goodnessは、等しい場合に必要な並べ替えを追加する必要があります。

bool operator<(const BestPair& other) const
{
    return goodness > other.goodness || goodness == other.goodnes && p1 < other.p1 || goodness == other.goodness && p1 == other.p1 && p2 < other.p2;
}
于 2013-03-28T11:42:15.980 に答える
1

3 番目の要素は 2 番目の要素と等しいため、3 であってはなりません (どちらも精度が 0.794 です)。セットは重複を挿入しません。必要かもしれませんがstd::multiset、確認するのは難しいです。どのような種類のセットも、スタックの適切な実装とは見なしません。

于 2013-03-28T11:43:05.770 に答える