要在std :: lower_bound中使用的比较运算符

时间:2015-05-28 03:47:15

标签: c++ operator-overloading stl-algorithm

我的编译器拒绝编译这个简单的代码:

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链接,您似乎只需要定义一个常量比较运算符,这正是我正在做的事情。我在这里缺少什么吗?

1 个答案:

答案 0 :(得分:2)

问题在于地图的值类型为std::pair<const mystruct, int>,因此std::lower_bound正在尝试将mystructstd::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});