Std::set元素消失
std::set elements vanishes away
我在下面的代码中创建了一个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
根据c++ 11标准第23.2.4/3段关于关联容器的要求:
短语"等价的键"是指由比较所施加的等价关系,而不是键键上的
operator==
。也就是说,两个键k1
和k2
在比较中被认为是等价的对象comp
,comp(k1, k2) == false && comp(k2, k1) == false
。对于表中任意两个键k1
和k2
同一容器,调用comp(k1, k2)
将始终返回相同的值。
由于您没有通过更改权重来满足此先决条件(并且您的比较器使用这些权重来定义集合元素的排序),因此您的程序具有未定义行为。
根据Andy Prowl所引用的推论,每次更改权重数组时都需要重新生成一个新集合
相关文章:
- Mongodb c++驱动程序:如何查询元素的数组
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 使用strcpy将char数组的元素复制到另一个数组
- 使用不带参数的函数访问结构元素
- 给定n个元素的m个集合.在C++中找到出现在最大集合数中的元素
- C++如何通过用户输入删除列表元素
- lower_bound()返回最后一个元素
- 基于多个条件处理地图中的所有元素
- 调整大小后指向元素值的指针unordered_map有效?
- 使用std::transform将一个范围的元素添加到另一个范围中
- 使用函数"remove"删除重复元素
- 具有最大子序列大小的序列,每个元素都相同
- 如何将两个不同矢量的同一位置的两个元素组合在一起
- 如何将元素添加到数组的线程安全函数?
- 有没有办法将谓词中的元素偏移量传递给 std 算法?
- 我想访问std::unique_ptr中的一个特定元素
- 为什么我在使用矢量的 push_back() 函数后元素消失了
- Std::set元素消失
- Push_back元素在添加后会消失
- CHTMLView元素页面加载然后消失