我有一个按其整数索引排序的类对象向量。但是对象的索引是由类的成员函数生成的 - 因此没有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?我如何实现这一目标?
答案 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();
}
}