Утилита (C ++) - Utility (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); }

использованная литература

  1. ^ Авторские права (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 >
  2. ^ Мне бы., <https://gcc.gnu.org/onlinedocs/libstdc++/libstdc++-html-USERS-4.4/a00894.html >
  • ISO / IEC 14882: 2011 проект спецификации (PDF). п. 508, § 20.

внешние ссылки

Смотрите также