我的编译器拒绝编译这个简单的代码:
struct mystruct{
int x;
bool operator<(const mystruct& y) const{ return x < y.x; }
};
std::map<mystruct, int> test;
auto it = std::lower_bound(test.begin(), test.end(), mystruct{2});
我收到了错误
error C2893: Failed to specialize function template 'unknown-type std::less<void>::operator ()(_Ty1 &&,_Ty2 &&) const'
查看this链接,您似乎只需要定义一个常量比较运算符,这正是我正在做的事情。我在这里缺少什么吗?
答案 0 :(得分:2)
问题在于地图的值类型为std::pair<const mystruct, int>
,因此std::lower_bound
正在尝试将mystruct
与std::pair<const mystruct, int>
进行比较。并且没有为此定义运算符。
您无论如何都不应该在std::lower_bound
上使用std::map
。它将在O(n)中工作,因为映射没有随机访问迭代器。 std::map
有自己的lower_bound
成员函数,它将利用树结构在O(log n)中给出结果。
auto it = test.lower_bound(mystruct{2});