我的项目中有一张地图.每次插入新元素时,我都希望确保插入的新元素的键至少是地图中其他元素的最小宽度.为此,我写了一个自定义比较类,如下所示:
class PulseCompare
{
public:
PulseCompare(int minwidth_):minwidth(minwidth_){};
bool operator()(const int x, const int y) const {
if(abs(x-y)>minwidth) return false;
else return true;
}
private:
int minwidth;
};
Run Code Online (Sandbox Code Playgroud)
并创建了这样的地图:
std::map<int,float,PulseCompare> pulsemap(PulseCompare(256));
Run Code Online (Sandbox Code Playgroud)
在我插入元素之前,我使用如下map.find方法:
if ( pulsemap.find(1600) == pulsemap.end() ) {
// not found so I can insert
} else {
// found
}
Run Code Online (Sandbox Code Playgroud)
但问题是,当图试图反射性地使用上述通过互换的价值比较功能x和y,就得到true了两种情况通常是不正常的比较操作等的情况<和>
在std::map::key_comp 这里的cplusplus文档页面上它说,我引用
在构造上设置地图对象的比较对象.其类型(成员key_compare)是地图模板的第三个模板参数.默认情况下,这是一个较小的对象,它返回与运算符"<"相同的对象.
此对象确定容器中元素的顺序:它是一个函数指针或一个函数对象,它接受与元素键相同类型的两个参数,如果第一个参数被认为是在第二个参数之前,则返回true.它定义的严格弱排序,否则为假.
如果key_comp以反射方式返回false,则认为两个键是等效的(即,无论键作为参数传递的顺序如何).
但这并没有说明它是反射性的情况true.谁能告诉我它的行为会是什么呢?或者我应该只通过迭代整个地图来进行间隔比较?
std::map必须提供对象的严格弱排序.std::map将产生未定义的行为.注意:让比较器提供总排序通常更容易.
另外,让我们描述严格的弱排序需要什么.在这里,我将摘录C++ 2011,第25.4节.
Compator comp;我将把它comp(lhs, rhs)称为一个返回布尔值的函数.把它想象成是有帮助的lhs < rhs.equiv(lhs, rhs).这被定义为(!comp(lhs, rhs) && !comp(rhs, lhs)).所以,!(lhs < rhs) && !(rhs < lhs).我们需要遵守以下规则:
comp(a, b) && comp(b, c) implies comp(a, c)
equiv(a, b) && equiv(b, c) implies equiv(a, c)
Run Code Online (Sandbox Code Playgroud)
为什么不把它用作你的比较器?
return minwidth < (y - x);
Run Code Online (Sandbox Code Playgroud)
这是一个工作示例:http : //coliru.stacked-crooked.com/a/e115d3a2f6714773