2013-04-08 62 views
1

我在下面的代码中创建了一个std::set,其中元素基于数组进行排序。std :: set元素消失

int weight[] = {0, 1, 58, 21, 10, 21, 24}; 

struct Comp 
{ 
    public: 
    bool operator() (const int &a, const int &b) const 
    { 
     if (weight[a] == weight[b]) 
      return a < b; 
     else 
      return weight[a] < weight[b]; 
    } 
}; 
set<int, Comp> s; 

令人惊讶地,当我改变任何元件的weight阵列中,在所述一组相应的元件消失了。这里是我的测试功能:

void print() 
{ 
    printf("Elements = "); 
    for(int i = 1; i <= 6; i++) 
     if(s.find(i) != s.end()) 
      printf("%2d ", i);; 
    printf("\n"); 
} 

int main() 
{ 
    for(int i = 1; i <= 6; i++) 
     s.insert(i); 

    print(); 
    weight[2] = 1; 
    weight[5] = 15; 
    print(); 

    return 0; 
} 

输出:

Elements = 1 2 3 4 5 6 
Elements = 1 3 4 6 

我使用buntu gcc 4.6.3

+0

时间来重新生成一组新的,这是为什么奇怪? 's.find()'使用你的'weight'数组,所以如果你改变它,你应该期待'find'的行为不同。 – 2013-04-08 13:23:40

+2

您正在修改组合后的订购标准。这是行不通的。 – juanchopanza 2013-04-08 13:24:07

回答

6

每对关联容器的要求的第C++ 11标准的23.2.4/3:

短语“键的等价”是指通过比较施加的等价关系,而不是 operator==在键上。也就是说,如果用于比较 对象comp,comp(k1, k2) == false && comp(k2, k1) == false,则两个键​​和k2被认为是等同的。 对于任何两个键​​和k2在 相同的容器中,调用comp(k1, k2)应始终返回相同的值

既然你没有履行这个先决条件通过改变权重(和你比较使用这些权重上的一组元素定义排序),你的程序有未定义行为

1

至于什么安迪伺机引述一个推论,你就需要在每次你改变你的体重阵列