binary_search on属性的汇编错误

Compilation error for a binary_search on the attributes

本文关键字:汇编 错误 属性 on search binary      更新时间:2023-10-16

我有一个 X

的实例的向量 v
class X
{
public:
  int attribute_1;
  ... 
  operator==(const int i){return this->attribute_1 == i;}
};
std::vector<X> v;

向量v由属性attribute_1排序。我想执行binary_search来测试给定整数是否与X实例之一的attribute_1匹配。我尝试了

int elem = 12
bool isElementPresent = std::binary_search(
        v.begin(),
        v.end(),
        elem,
        [](const X& right, const X& left){return right.attribute_1 < left.attribute_1;}
      )
    )

但是它无法编译。如果我创建一个将X的实例使用attribute_1设置为elem,那么它有效,但我想避免执行此操作(因为1.构建具有许多其他属性的类 X的对象,我会需要写一个极简主义的构造函数,并且很害怕我会错误地将其在代码中的其他地方使用)。

我本来希望operator==过载会使它起作用。为什么不起作用?是否有一个解决方案不会迫使我使用attribute_1 = elem创建X的实例?

为什么不起作用?

std::binary_search也使用比较对象来检查平等。这样做类似于comp(a, b) || comp(b, a)。如果该表达式为false,则A均不小于B或B小于A。因此它们必须相等。

由于此用法,比较对象需要接受集合的对象,以及搜索为 act 的值。第一个和第二个参数。

一种解决方案是使用"投影"类,其对象可以从所讨论的类以及要与您要比较的值中构造。在第一种情况下,投影类从类成员中提取值,然后将其存储给其自己的成员。在另一种情况下,它只是将价值复制到其自己的成员。

有趣的是,这甚至可以变得非常通用:

template<typename D, typename P, P> struct projection;
template<typename Data, typename Class, typename Return, Return (Class::*member_function) () const>
struct projection<Data, Return (Class::*) () const, member_function> {
 Data data;
 projection (Class const & object)
  : data ((object.*member_function)()) {}
/* template<typename X>
 projection (X&& input)
  : data (std::forward<X>(input)) {}*/
 projection (Data d) : data (d) {}
};

然后将此投影类用作搜索使用的比较对象的两个参数。示例:

struct Item {
 int x;
 int get () const { return x; }
};

int main () {
 Item items [] = {1,2,3,4,5,99};
 using P = projection<int, decltype(&Item::get), &Item::get>;
 auto compare = [](P const & left, P const & right) {
               return left.data < right.data; };
 std::cout << std::binary_search(
      std:: begin (items), std::end(items),
      4, compare)
    << std::endl;
 std::cout << std::binary_search(
      std:: begin (items), std::end(items),
      44, compare)
    << std::endl;
}

上面的代码使用常数成员函数(" Getters"),但是有了以下专业化,它也适用于成员的指针:

template<typename Data, typename Class, typename Member, Member (Class::*member_pointer)>
struct projection<Data, Member (Class::*), member_pointer> {
 Data data;
 projection (Class const & object)
  : data (object.*member_pointer) {}
/* template<typename X>
 projection (X&& input)
  : data (std::forward<X>(input)) {}*/
 projection (Data d) : data (d) {}
};