Как использовать upper_bound на массиве парыв С ++? - PullRequest
0 голосов
/ 02 июня 2018

Я хочу использовать upper_bound для массива пары, и это тоже с помощью функции компаратора, которая сравнивает второй параметр пары.Пожалуйста, помогите.

Код :

bool cmp(const pair<int,int> &p1, const pair<int,int> &p2)
{
    return p1.second<p2.second;
}

int subsets(pair<int,int> time[], int p)
{
    if(p == 0)  return 1;
    int j = upper_bound(time, time+p, time[p], cmp) - time;
}


РЕДАКТИРОВАТЬ : я исправилвозвращаемый тип, но я не могу получить то, что хотел в качестве вывода.
У меня есть массив pair<int,int> с именем time, который содержит время начала и окончания в качестве первого и второго параметра соответственно и отсортирован по времени окончанияНарастающим образом.

В настоящее время я нахожусь по индексу p.Я хочу найти максимальный индекс массива (= j), такой, что time[j].second <= time[p].first.
Например.
время = {(1,5), (4,7),(6, 12)} и если p = 2 (индексирование на основе 0), то j должно быть = 0 (как 5 <= 6, но 7> 6), но upper_bound дает мне j = 2.

Как я могудостичь этого?

Ответы [ 2 ]

0 голосов
/ 02 июня 2018

Следующий код выполняет работу:)

bool compareit(int n, pair<int,int> &p)
{
    return p.second > n;
}

int subsets(pair<int,int> time[], int p)
{
    if(p == 0)  return 1;
    int j = upper_bound(time, time+p, time[p].first, compareit) - time;
}
0 голосов
/ 02 июня 2018

Нет ничего плохого в вашей функции cmp, ошибка возникла при попытке сохранить возвращаемое значение std::upper_bound в int j.

Согласно ссылке , std::upper_bound:

Возвращает итератор, указывающий на первый элемент в диапазоне [первый, последний), который больше значения или последний, если такой элемент не найден.

Таким образом, чтобы получить позицию найденного элемента в вашем массиве time, вам нужно изменить код следующим образом:

int j = upper_bound(time, time + p, time[p], cmp) - time;

или эквивалентно, используйте функцию std::distance.

Также не забудьте проверить, существует ли такой элемент (т. Е. std::upper_bound вернул time + p в этом случае).

...