将struct元素插入有序集失败

时间:2013-03-28 11:40:10

标签: c++ insert set

我需要将元素的结构插入到集合中,如下所示:

// 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;
            }
        }
    }
}

但是在运行时,代码永远不会插入第三个,第四个等元素,这对我来说很奇怪,因为它们是不同的元素。

// 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

我做错了什么?怎么解决?

2 个答案:

答案 0 :(得分:3)

如果两个元素相等goodness,则认为它们相等,并且不能存储在set中。如果你想要允许重复,请使用multiset

一般而言,如果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;
}

答案 1 :(得分:1)

它不应该是三,因为你的第三个元素等于你的第二个元素(两者都有0.794的优点)。集合不插入重复项。也许你需要std::multiset,但很难确定。我不认为任何类型的集合是一个很好的堆栈实现。