集合的结构之间的比较

Comparsion between structs for a set

此代码有效,但在 weighted_pointer 之外有一个名为 ptrcomp 的结构(对我而言)似乎它们是不同的东西。我尝试了一些不同的方法,甚至用谷歌搜索,但我还没有找到像这样工作的东西。

struct node{
    unsigned int oper;
    void * a;
    void * b;
};

struct weighted_pointer{
    mutable int weight;
    unique_ptr<node> pointer;
};

struct ptrcomp{
    bool operator()(const weighted_pointer & lhs, const weighted_pointer & rhs) {
        return tie(lhs.pointer->oper, lhs.pointer->a, lhs.pointer->b) < tie(rhs.pointer->oper, rhs.pointer->a, rhs.pointer->b);
    }
};

set<weighted_pointer,ptrcomp> gate;

我的 objective 是为了让 std::set 正常工作。并且可能写成 set<weighted_pointer>.

having a struct called ptrcomp outside the weighted_pointer seems (to me) that they are different things.

事实就是如此。 weighted_pointer是数据,而ptrcomp是数据比较的一种方式。所以,这两个 确实是 不同的东西,你的代码没有任何问题。

如果您碰巧有一种比较数据的规范方法,请将其设为 operator <:

bool operator < (const weighted_pointer & lhs, const weighted_pointer & rhs) {
    return tie(lhs.pointer->oper, lhs.pointer->a, lhs.pointer->b) < tie(rhs.pointer->oper, rhs.pointer->a, rhs.pointer->b);
}

std::set 会愉快地使用它,如果你将它用作 std::set<weighted_pointer>(事实上,std::set 的第二个模板参数默认为 std::less<T>,这是一个使用 operator <).

的比较器 class

如果您将代码更改为

struct weighted_pointer {
    mutable int weight;
    unique_ptr<node> pointer;

    bool operator < (const weighted_pointer & rhs) const;
};

bool weighted_pointer::operator < (const weighted_pointer & rhs) const {
    return tie(pointer->oper, pointer->a, pointer->b) < tie(rhs.pointer->oper, rhs.pointer->a, rhs.pointer->b);
}

然后它将起作用,并且您不需要 set 的比较器 ptrcomp,并且可以根据需要使用类型 set<weighted_pointer>。 (如果愿意,您也可以将定义移动到结构中。)

struct weighted_pointer {
 // ...
 struct compare {
  // ...
  };
};


set<weighted_pointer,weighted_pointer::compare> gate;

// better

using weighted_pointer_set = set<weighted_pointer,weighted_pointer::compare>;
weighted_pointer_set gate;

这就是我通常的做法。

有一个 std::set<weighted_pointer> 意味着集合使用 std::less 来比较元素。这又会调用相应类型的 operator<,因此如果您提供该运算符的实现,它将起作用。