#c #algorithm #data-structures #stl #structure
#c #алгоритм #структуры данных #stl #структура
Вопрос:
У меня есть отсортированный массив структур. Я хочу использовать для этого std::binary_search
или std::find
.
Куда бы я ни посмотрел, я нахожу примеры, которые показывают, как это сделать с вектором структур. Никогда с массивом структур. Я не уверен, должен ли я использовать предикат или перегружать =
оператор или что.
Каким должен быть третий параметр для std::find
, если я использую следующий вызов:
template< class InputIt, class T >
InputIt find( InputIt first, InputIt last, const Tamp; value );
Кроме того, в нем говорится, что вышеупомянутые вызовы вернут итератор или вернут последний. Как это работает со структурами. Структуры не имеют итераторов, не так ли?
Комментарии:
1. То же самое происходит с массивом в виде вектора. Если вы используете массивы C, они должны быть
std::array
, иstd::begin
иstd::end
работать независимо.2. Нет способа сделать это без std::arrays? что, если я использую обычную структуру a [MAX]?
3.
std::begin
иstd::end
работают независимо . А для массивов итератором будет указатель. Указатели соответствуют требованиям итераторов с произвольным доступом.4. @chris и как определить,
std::find
какой конкретный элемент данных структуры использовать для сравнения? перегружать=
оператор? И что будет содержать возвращаемое значение? индекс?5.Как указано в любой ссылке,
std::find
используетoperator==
, или вы можете использоватьstd::find_if
. И это возвращает итератор (указатель здесь) на найденный элемент илиlast
.
Ответ №1:
Если вы хотите применить это к (допустимому) диапазону массивов [a, b)
массива arr
, InputIt
должно быть std::begin(arr) a
и OutputIt
должно быть std::begin(arr) b
. Если b
равно количеству элементов в arr
, то вы также можете задать OutputIt
значение std::end(arr)
.
std::begin
и std::end
вызванный массив типа T возвращает T *. Таким образом, вы всегда можете заменить T * на InputIt
и OutputIt
, когда думаете об этих функциях в массивах. std::find
возвращает InputIt. Итак, вы получаете указатель на соответствующий элемент массива. Если ничего не было найдено, он возвращает last
.
Комментарии:
1. Как интерпретировать возвращаемое значение?
2. @Wildling: Для необработанных массивов типа
T
тип итератора — указатель наT
.