binary_search通过其成员函数的返回变量查找类对象[c ++]

时间:2017-03-01 06:08:58

标签: c++ algorithm stl binary-search

我有一个按其整数索引排序的类对象向量。但是对象的索引是由类的成员函数生成的 - 因此没有int id存储为成员变量。

class boundary
{
     public:
     int get_id();
}

std::vector<boundary> sample;

现在我需要找到boundary对象,int id生成的get_id()与我搜索的int value相同。< / p>

auto &iter = binary_search(sample.begin(),sample.end(), 5, custom_function)
 //should compare iter.get_id() == 5

在这种情况下是否可以使用binary_search?我如何实现这一目标?

3 个答案:

答案 0 :(得分:6)

在这种情况下你应该使用std :: lower_bound:

bool custom_function(boundary& obj, int id)  { return obj.get_id() < id; }
...
auto iter = lower_bound(sample.begin(),sample.end(), 5, custom_function);

(如果想要更好的性能,用函数对象替换函数指针)

答案 1 :(得分:2)

假设:您希望获取所查找元素的引用(而不是它的迭代器)。

boundary& find_boundary(std::vector<boundary>& sample, int id)
// precondition: a boundary with id does exist in the sample
{ 
  auto less_by_id = [](boundary const& b, int id) // lambda is faster than function pointers
    { return b.get_id() < id; };

  auto it = lower_bound(sample.begin(), sample.end(), id, less_by_id);

  assert (it != sample.end());
  assert (it->get_id() == id);
  return *it;      
}

现在,您可以使用它:

boundary& b = find_boundary(sample, 5);

答案 2 :(得分:-1)

您可以创建一个满足&#34;比较&#34;的对象。概念。 http://en.cppreference.com/w/cpp/concept/Compare

例如:

class Compare {
public:
    bool operator()(boundry a, boundry b) {
        return a.get_id() < b.get_id();
    }
}