如果反射性地为真,那么C++中std :: map中的compare函数如何工作?

Viv*_*V K 2 c++ stl stdmap

我的项目中有一张地图.每次插入新元素时,我都希望确保插入的新元素的键至少是地图中其他元素的最小宽度.为此,我写了一个自定义比较类,如下所示:

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)

但问题是,当图试图反射性地使用上述通过互换的价值比较功能xy,就得到true了两种情况通常是不正常的比较操作等的情况<>

std::map::key_comp 这里的cplusplus文档页面上它说,我引用

在构造上设置地图对象的比较对象.其类型(成员key_compare)是地图模板的第三个模板参数.默认情况下,这是一个较小的对象,它返回与运算符"<"相同的对象.

此对象确定容器中元素的顺序:它是一个函数指针或一个函数对象,它接受与元素键相同类型的两个参数,如果第一个参数被认为是在第二个参数之前,则返回true.它定义的严格弱排序,否则为假.

如果key_comp以反射方式返回false,则认为两个键是等效的(即,无论键作为参数传递的顺序如何).

但这并没有说明它是反射性的情况true.谁能告诉我它的行为会是什么呢?或者我应该只通过迭代整个地图来进行间隔比较?

Bil*_*nch 9

  1. 使用的比较器std::map必须提供对象的严格弱排序.
  2. 你的比较器没有.
  3. 因此,您的实例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)


Bra*_*don 5

为什么不把它用作你的比较器?

return minwidth < (y - x);
Run Code Online (Sandbox Code Playgroud)

这是一个工作示例:http : //coliru.stacked-crooked.com/a/e115d3a2f6714773