Как мы уже видели, стандартные алгоритмы хорошо работают с последовательностями элементов базовых типов, таких как int и double. Однако в некоторых предметных областях более широко используются контейнеры объектов пользовательских классов. Рассмотрим пример, играющий главную роль во многих областях, — сортировка записей по нескольким критериям.
Также возможно вы думаете, что такая тема как http://www.arealshina.ru/shiny-bridgestone/ никак не связана и даже не тематична с программированием. Хотя, может быть и связана.
В любом случае все-таки зайдите на сайт arealshina - там можно узнать много интересного про то, где есть резина bridgestone, и сколько стоит резина bridgestone.
Что означает вообще резина bridgestone, где купить резина bridgestone - про это написано на сайте arealshina про резина bridgestone.
Это важная для многих тема - резина bridgestone Спасибо сайту arealshina за информацию про резину bridgestone
struct Record {
string name; // стандартная строка char addr[24]; // старый стиль для согласованности // с базами данных
// . . .
};
vector vr;
Иногда мы хотим сортировать вектор vr по имени, а иногда — по адресам. Если мы не стремимся одновременно к элегантности и эффективности, наши методы ограничены практической целесообразностью. Мы можем написать следующий код: // . . .
sort(vr.begin(), vr.end(), Cmp_by_name()); // сортировка по имени // . . .
sort(vr.begin(), vr.end(), Cmp_by_addr()); // сортировка по адресу // . . .
Cmp_by_name — это объект-функция, сравнивающий два объекта класса Rec- “1 ord по членам name. Для того чтобы дать пользователю возможность задавать критерий сравнения, в стандартном алгоритме sort предусмотрен необязательный третий аргумент, указывающий критерий сортировки. Функция Cmp_by_name() создает объект Cmp_by_name для алгоритма sort(), чтобы использовать его для сравнения объектов класса Record. Это выглядит отлично, в том смысле, что нам не приходится об этом беспокоиться самим. Все, что мы должны сделать, — определить классы Cmp_by_name и Cmp_by_addr.
// разные сравнения объектов класса Record:
struct Cmp_by_name {
bool operator()(const Record& a, const Record& b) const
АЛГОРИТМЫ И АССОЦИАТИВНЫЕ МАССИВЫ
{ return a.name < b.name; }
};
struct Cmp_by_addr {
bool operator()(const Record& a, const Record& b) const { return strncmp(a.addr, b.addr, 24) < 0; } // !!!
};
Класс Cmp_by_name совершенно очевиден. Оператор вызова функции operator()() просто сравнивает строки name, используя оператор < из стандартного класса string. Однако сравнение в классе Cmp_by_addr выглядит ужасно.
Это объясняется тем, что мы выбрали неудачное представление адреса — в виде массива, состоящего из 24 символов (и не завершающегося нулем). Мы сделали этот выбор частично для того, чтобы показать, как объект-функцию можно использовать для сокрытия некрасивого и уязвимого для ошибок кода, а частично для того, чтобы продемонстрировать, что библиотека STL может решать даже ужасные, но важные с практической точки зрения задачи. Функция сравнения использует стандартную функцию strncmp(), которая сравнивает массивы символов фиксированной длины и возвращает отрицательное число, если вторая строка лексикографически больше, чем первая. Как только вам потребуется выполнить такое устаревшее сравнение, вспомните об этой функции.
Опубликовал katy
April 23 2015 07:55:52 ·
0 Комментариев ·
3004 Прочтений ·
• Не нашли ответ на свой вопрос? Тогда задайте вопрос в комментариях или на форуме! •
Комментарии
Нет комментариев.
Добавить комментарий
Рейтинги
Рейтинг доступен только для пользователей.
Пожалуйста, залогиньтесь или зарегистрируйтесь для голосования.
Нет данных для оценки.
Гость
Вы не зарегистрированны? Нажмите здесь для регистрации.