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