std :: lower_bound和比较器函数有不同的类型?

时间:2011-02-21 22:59:28

标签: c++ stl

我有一个结构数组,按结构成员排序,如:

struct foo
{
    int bar;
    double baz;
};

// An array of foo, sorted on .bar
foo foos[] = { ........ };
// foos[0] = {0, 0.245}
// foos[1] = {1, -943.2}
// foos[2] = {2, 304.222}
// etc...

我想找到具有特定.bar值的元素。它可能是也可能不在数组中,我想在O(log(n))时间内完成,因为数组已经排序。

std::lower_bound是我通常会选择的,但我需要指定一个比较函数。但是,数组成员的类型(struct foo)和搜索的值(int)不一样,因此,我的比较器是:

bool comp(foo a, int b)
{
    // ...
}
// --- or ---
bool comp(int a, foo b)
{
    // ...
}

看起来第一个将与gcc一起使用,但我想知道比较函数的参数的顺序是否由标准指定,或者我是否依赖于编译器行为。

我希望避免在此处构建foo传递给std::lower_bound,因为不需要完整的foo,而且费用可能很高。我的另一个选择是将foo *包装在只暴露.bar成员的自定义迭代器中。

2 个答案:

答案 0 :(得分:14)

来自标准25.3.3.1/3,std::lower_bound()

  

返回i范围内的最远迭代器[first, last]   对于范围内的任何迭代器j   [first, i)以下内容   相应的条件成立:*j < valuecomp(*j, value) != false

由此,您可以使用

bool comp(foo a, int b)

或者您可以比较两个foo个实例,然后在两个实例中访问bar

答案 1 :(得分:3)

这应该是对wilhelmtell的帖子的评论,但我没有足够的分数来做到这一点......

我只想指出这也适用于MS编译器,但您需要定义

comp(foo lhs, foo rhs)

否则您的代码将无法在调试模式下编译。