我可以使用STL进行二进制搜索吗?

时间:2013-09-11 19:41:23

标签: c++ stl

我正在尝试重构一些不使用STL来使用它提供的通用算法的代码。 我有这样的结构:

struct A {
int i;
//other stuff...
};
// ...
A* array; // array of A objects, sorted by A::i member
int n = ...; // array size

然后有一个编码的函数需要An和一个整数k,其目的是指向我的第一个和最后一个元素。 i成员等于k的数组。

这是在二进制搜索方面手工实现的。我在考虑使用std::equal_range。问题是它需要A类对象才能工作,它迫使我引入一个“虚拟”A对象,其i成员等于k

有没有办法使用STL来做到这一点,而不必引入“虚拟”对象? 感谢

3 个答案:

答案 0 :(得分:4)

如果根据A::i的值对您的范围进行排序,则可以使用custom comparator进行排序,但请注意,比较器必须能够兼顾两种方式:

struct AComp
{
    bool operator()(int n, A const & a) const { return n < a.i; }
    bool operator()(A const & a, int n) const { return a.i < n; }
};

auto p = std::equal_range(array, array + n, 5, AComp());

现在,范围[p.first, p.second)包含A::i等于5的元素。

链接页面或多或少包含此示例。

答案 1 :(得分:1)

您也可以使用std::binary_search()中定义的<algorithm>进行二进制搜索。原型是:

template <class ForwardIterator, class T>
  bool binary_search (ForwardIterator first, ForwardIterator last,
                      const T& val);

或:

template <class ForwardIterator, class T, class Compare>
  bool binary_search (ForwardIterator first, ForwardIterator last,
                      const T& val, Compare comp);

答案 2 :(得分:0)

你可以定义一个转换运算符(我猜这更像是黑客)

class A
{
    private:
        int i;
    public:
        A(int x) : i(x){}
        operator int(){
            return i;
        }
};

如果这样做,你不必定义运算符&lt;在你的结构中。