【发布时间】:2017-10-30 03:52:25
【问题描述】:
我了解,如果 < 运算符在 C++ 中被重载(例如,将自定义结构插入到 std::set),则实现必须是基础类型之上的 strict weak order。
考虑以下struct 和实现。这个实现不是严格的弱顺序,但是代码编译和运行不会抛出错误(考虑到严格的弱顺序的要求,我希望它会抛出错误):
#include <iostream>
#include <set>
using namespace std;
struct Pixel {
int x;
int y;
};
bool operator < (Pixel lhs, Pixel rhs){
return lhs.x < rhs.x || lhs.y < rhs.y;
};
int main(){
set<Pixel> mySet;
Pixel *newPixelA = new Pixel;
newPixelA->x = 1;
newPixelA->y = 3;
Pixel *newPixelB = new Pixel;
newPixelB->x = 4;
newPixelB->y = 2;
mySet.insert(*newPixelA);
mySet.insert(*newPixelB);
}
这是预期的行为吗?编辑:使用 Xcode。
【问题讨论】:
-
未定义的行为是未定义的。 “似乎有效”是未定义行为的一种可能表现形式。
-
您的“似乎有效”确实是对您观察到的内容的准确描述。还不清楚为什么要动态分配源对象以进行插入。
-
尝试超过 2 个项目。Visual Studio 在调试版本中立即抛出异常。
-
既然你期望它会抛出一个错误而它不会,你为什么说它“看起来工作得很好”?难道它没有做你应该期望它做的与正常工作相反的事情吗?
-
简短回答:如果您的比较函数不符合要求,则您的代码具有未定义的行为。您可能会收到某种错误消息,或者它似乎可以工作,或者几乎是其他任何东西。该标准对结果没有任何要求。
标签: c++ algorithm sorting c++11 set