binary_search总是返回true c ++

时间:2016-01-19 20:14:21

标签: c++ syntax-error binary-search

我遇到了这个问题,我正在处理职位向量。 该矢量在一种情况下相对于耦合“位置”的第一分量排序,而在另一种情况下相对于另一种情况排序,在这两种情况下,该耦合的另一元素保持不变。 例如,我有:

 1 1, 1 3, 1 7, 1 11  //second case

现在我想使用binary_search算法来查找其中一个这样的向量中是否存在特定位置,但即使它不应该也是肯定的答案!

这是我的代码

using namespace std;

class position{
     int r;
     int c;
public:
     position(int r=0, int c=0): r(r), c(c){
     };

position &operator=(position p);

int getr(){
    return r;
};
int getc(){
    return c;
};
friend bool operator>(const position &p, const position &q);
friend bool operator<(const position &p, const position &q);
friend bool operator==(const position &p, const position &q);

};

bool operator>(const position &p, const position &q);{
    return((p.r>q.r)&&(p.c>q.c));
};

bool operator<(const position &p, const position &q);{
    return q>p;
};

bool operator==(const position &p, const position &q);{
    return((p.r==q.r)&&(p.c==q.c));
};

 int main(){
 vector<position> R;

 for(int i=0;i<10;i++)
    R.push_back(position(1,2*i));

 for(int i=0;i<R.size();i++)
    cout<<R[i];
 cout<<endl;
 posizione a(1,7);

 cout<<binary_search(R.begin(),R.end(),a);

 }

3 个答案:

答案 0 :(得分:2)

  • STL要求operator<,而不是operator>。您应该遵循其示例,以便在使用其他算法时不会有任何意外。
  • 您的比较不正确,并会返回误报。虽然其他答案正确地解释了如何解决这个问题,但无论如何你应该真的使用std::pair<int, int>。它为您实现了这一功能和更多功能。
using Position = std::pair<int, int>;

std::vector<Position> v{make_positions()};
Position a{1, 5};
std::sort(v.begin(), v.end());
bool exists = std::binary_search(v.begin(), v.end(), a);

答案 1 :(得分:1)

您的比较器存在缺陷,因为它没有创建严格的订单。

尝试:

bool  operator > (const position&p, const operator&q){
    return((p.x>q.x)|| (p.x==q.x && p.y>q.y));
}

问题的详细说明:

使用您自己的实现:

  • 这对夫妇{1,4}不会大于{1,3},因为1不大于1,所以逻辑并且将返回false。
  • 但{1,3}不会大于{1,4}。

如果这对夫妻中没有一对比另一对更大,那么他们原则上应该是平等的。但事实并非如此,您的比较器不适合二进制搜索。

答案 2 :(得分:1)

您的operator >并不保证严格的订购。在处理comapring多个成员变量时,我发现最好使用std::tie。以下内容应该能为您提供正确的结果

bool  operator > (const position&p, const operator&q){
    return std::tie(p.x, p.y) > std::tie(q.x, q.y);
}