考虑以下计划
struct slot {
int item;
bool operator<(const int& right) const {
return item < right;
}
slot(int item) : item(item) {}
};
int main() {
std::vector<slot> rails;
std::lower_bound(cbegin(rails), cend(rails), 5);
std::upper_bound(cbegin(rails), cend(rails), 5);
}
我使用std :: upper_bound来二进制搜索向量,但在编译时失败
c:\program files (x86)\microsoft visual studio 14.0\vc\include\algorithm(2609): error C2672: 'operator __surrogate_func': no matching overloaded function found
考虑到std::upperbound
使用operator<
进行隐式比较而不使用谓词的事实,我找不到编译器抱怨的正当理由。此外,错误消息不是很有意义,因为我没有看到在这里使用代理函数的原因。即使是使用仿函数less<>
的情况,也不应该是问题,因为slot
与整数的可比性较低。值得注意的是std::lower_bound
具有可接受的语法。
答案 0 :(得分:2)
当std::upper_bound
的规范清楚地说明时,它应用与左侧的参数值和右侧的序列元素的比较。即在你的情况下,这将是int < slot
比较。您的operator <
不支持按特定顺序排列的比较。
对于std::upper_bound
,您需要
bool operator <(int left, const slot &s)
{
return left < s.item;
}
,不能作为成员函数实现。
同时,std::lower_bound
将比较应用于右侧的参数值,即slot < int
比较。
您的原始实施适用于std::lower_bound
,但不适用于std::upper_bound
。
答案 1 :(得分:0)
正如上面的回答所建议的,如果可以实现operator <
来获取2个参数,那么你的问题就可以得到解决,但这与成员函数实现相矛盾。但是如果这成为friend
函数会怎么样呢。事实证明,上述问题可以通过将其声明为朋友函数来解决。
所以你的代码看起来与此类似:
struct slot {
int item;
friend bool operator<(int left, const slot &s)
{
return left < s.item;
}
friend bool operator<(const slot &s, int left)
{
return s.item < left;
}
slot(int item) : item(item) {}
};