Утилита (C ++) - Utility (C++)
Стандартная библиотека C ++ |
---|
Контейнеры |
Стандартная библиотека C |
полезность
это заголовочный файл в Стандартная библиотека C ++. Этот файл состоит из двух ключевых компонентов:
rel_ops
, а пространство имен содержащий набор шаблонов, которые определяют поведение по умолчанию для реляционные операторы!=
,>
,<=
, и>=
между объектами одного типа на основе пользовательских операторов==
и<
.пара
, шаблон контейнера, который содержит два объекта-члена (первый
ивторой
) произвольного типа (ов). Кроме того, заголовок определяет реляционные операторы по умолчанию дляпара
s, у которых есть общие типы.
rel_ops
GCC Реализация декларирует rel_ops
пространство имен (вложено в пространство имен стандартное
) следующим образом:[1]
пространство имен rel_ops { шаблон <класс _Tp> в соответствии bool оператор !=(const _Tp& __Икс, const _Tp& __y) { вернуть !(__Икс == __y); } шаблон <класс _Tp> в соответствии bool оператор >(const _Tp& __Икс, const _Tp& __y) { вернуть __y < __Икс; } шаблон <класс _Tp> в соответствии bool оператор <=(const _Tp& __Икс, const _Tp& __y) { вернуть !(__y < __Икс); } шаблон <класс _Tp> в соответствии bool оператор >=(const _Tp& __Икс, const _Tp& __y) { вернуть !(__Икс < __y); } }
Рассмотрим следующее объявление класс А
, который определяет операторы равенства и меньше для сравнения с другими объектами того же типа:
класс А { int строительство; int номер;общественный: bool оператор ==(const А& Другой) const { вернуть (строительство == Другой.строительство) && (номер == Другой.номер); } bool оператор <(const А& Другой) const { вернуть (строительство < Другой.строительство) || (!(Другой.строительство < строительство) && (номер < Другой.номер)); } };пустота f1(const А& а1, const А& а2) { bool равный = (а1 == а2); // использует ==, определенный в классе A bool не равный = (а1 != а2); // ошибка: нет совпадения для "operator! =" в "a1! = a2" bool Меньше = (а1 < а2); // использует <определенный в классе A bool больше = (а1 > а2); // ошибка: нет совпадения для "operator>" в "a1> a2" bool less_equal = (а1 <= а2); // ошибка: нет совпадения для "operator <=" в "a1 <= a2" bool больше_равно = (а1 >= а2); // ошибка: нет совпадения для "operator> =" в "a1> = a2" }
Призывая rel_ops
шаблоны, остальным реляционным операторам можно присвоить значение по умолчанию. Однако, если в текущей области существует похожий оператор, зависящий от типа (т.е. не являющийся шаблоном), даже вне определения класса, компилятор предпочтет его.
// (продолжение сверху)#включают <utility>с помощью пространство имен стандартное::rel_ops;// оператор ниже заменяет rel_opsbool оператор >=(const А& а1, const А& а2) { do_something_else(); // выполняем отличительный побочный эффект вернуть !(а1 < а2); // но в остальном используйте ту же процедуру, что и rel_ops };пустота f2(const А& а1, const А& а2) { bool равный = (а1 == а2); // использует operator ==, определенный в классе A bool не равный = (а1 != а2); // использует! (a1 == a2) на rel_ops bool Меньше = (а1 < а2); // использует operator <, определенный в классе A bool больше = (а1 > а2); // использует (a2 bool less_equal = (а1 <= а2); // использует! (a2 bool больше_равно = (а1 >= а2); // использует глобальный оператор> =, определенный выше }
Конечно, можно было бы заявить следующее в тандеме с rel_ops
, позволяющий выводить все операторы отношения из <
:
шаблон <класс _Tp> в соответствии bool оператор ==(const _Tp& __Икс, const _Tp& __y) { вернуть !(__Икс < __y || __y < __Икс); }
пара
Объект, объявленный, например, как стандартное::пара<int, плавать>
будет состоять из двух членов, int первый;
и плавать второй;
, плюс три функции-конструктора.
Первый (по умолчанию) конструктор инициализирует оба члена значениями по умолчанию. 0
и 0.0
, тогда как второй принимает по одному параметру каждого типа. Третий - это копирующий конструктор шаблона, который принимает любые стандартное::пара<_U1, _U2>
, при условии типов _U1
и _U2
способны неявное преобразование к int
и плавать
соответственно.
Реализация GCC определяет пара
механизм следующим образом.[2]
шаблон<класс _T1, класс _T2> структура пара { typedef _T1 first_type; typedef _T2 второй_тип; _T1 первый; _T2 второй; пара(): первый(), второй() { } пара(const _T1& __a, const _T2& __b): первый(__a), второй(__b) { } шаблон<класс _U1, класс _U2> пара(const пара<_U1, _U2>& __п) : первый(__п.первый), второй(__п.второй) { } };
Кроме того, этот заголовок определяет все шесть реляционных операторов для пара
экземпляры с обоими типами общих. Они определяют строгий слабый порядок для объектов типа стандартное::пара<_T1, _T2>
, на основе первый
элементы, а затем на второй
элементы только тогда, когда первый
равны.
// продолжение сверхушаблон<класс _T1, класс _T2> в соответствии bool оператор ==(const пара<_T1, _T2>& __Икс, const пара<_T1, _T2>& __y) { вернуть __Икс.первый == __y.первый && __Икс.второй == __y.второй; }шаблон<класс _T1, класс _T2> в соответствии bool оператор <(const пара<_T1, _T2>& __Икс, const пара<_T1, _T2>& __y) { вернуть __Икс.первый < __y.первый || (!(__y.первый < __Икс.первый) && __Икс.второй < __y.второй); }шаблон<класс _T1, класс _T2> в соответствии bool оператор !=(const пара<_T1, _T2>& __Икс, const пара<_T1, _T2>& __y) { вернуть !(__Икс == __y); }шаблон<класс _T1, класс _T2> в соответствии bool оператор >(const пара<_T1, _T2>& __Икс, const пара<_T1, _T2>& __y) { вернуть __y < __Икс; }шаблон<класс _T1, класс _T2> в соответствии bool оператор<=(const пара<_T1, _T2>& __Икс, const пара<_T1, _T2>& __y) { вернуть !(__y < __Икс); }шаблон<класс _T1, класс _T2> в соответствии bool оператор>=(const пара<_T1, _T2>& __Икс, const пара<_T1, _T2>& __y) { вернуть !(__Икс < __y); }
Дополнительно заголовок содержит функцию-шаблон make_pair ()
который определяет свой возвращаемый тип на основе параметров:
// продолжение сверхушаблон<класс _T1, класс _T2> в соответствии пара<_T1, _T2> make_pair(_T1 __Икс, _T2 __y) { вернуть пара<_T1, _T2>(__Икс, __y); }
использованная литература
- ^ Авторские права (C) 2001, 2002, 2004, 2005, 2008 Free Software Foundation, Inc .; доступно под Стандартная общественная лицензия GNU, версия 3 и выше. Документация доступна в Интернете по адресу <https://gcc.gnu.org/onlinedocs/libstdc++/libstdc++-html-USERS-4.4/a00897.html >
- ^ Мне бы., <https://gcc.gnu.org/onlinedocs/libstdc++/libstdc++-html-USERS-4.4/a00894.html >
- ISO / IEC 14882: 2011 проект спецификации (PDF). п. 508, § 20.