У меня есть массив структур, отсортированных по элементу структуры, что-то вроде:
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.