我有一个结构数组,按结构成员排序,如:
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成员的自定义迭代器中。
答案 0 :(得分:14)
来自标准25.3.3.1/3,std::lower_bound()
:
返回:
i
范围内的最远迭代器[first, last]
对于范围内的任何迭代器j
[first, i)
以下内容 相应的条件成立:*j < value
或comp(*j, value) != false
。
由此,您可以使用
bool comp(foo a, int b)
或者您可以比较两个foo
个实例,然后在两个实例中访问bar
。
答案 1 :(得分:3)
这应该是对wilhelmtell的帖子的评论,但我没有足够的分数来做到这一点......
我只想指出这也适用于MS编译器,但您需要定义
comp(foo lhs, foo rhs)
否则您的代码将无法在调试模式下编译。